Форум » Программистские штучки » Сравнение списков в MatLab » Ответить

Сравнение списков в MatLab

Бутеноп: [pre2] %Функция сравнения двух массивов ячеек. % %Входные данные должны представлять собой массивы в три столбца. %Первый столбец-ключи в цифровом представлении, %второй-ключи в текстовом представлении, %третий-значения. % %Выходные аргументы: %Первый-содержит совпадающие значения %второй-значения, встретившиеся только в первом массиве %третий-значения, встретившиеся только во втором массиве. % %Синтаксис: %[Ok, be1, be2] = sravncell(cell1,cell2) function [Ok, be1, be2] = sravncell(cell1,cell2) temp=[size(cell1); size(cell2)]; [xxx yyy]=max(temp(:,1)); %Была мысля сделать автоматическое задание размерности массивов, но проще, однако, при необходимости код подправить % Ok=cell(2000,sum(temp(:,2))-1); % be1=cell(2000,temp(1,2)); % be2=cell(2000,temp(1,2)); Ok=cell(2000,4); %Массив, в котором записи, совпадающие по ключевым столбцам в обоих массивах be1=cell(2000,3); %Записи, которые есть только в первом массиве be2=cell(2000,3); %Записи, которые есть только во втором массиве indcell2=1; %отсель indOk=0; indbe1=0; indbe2=0; %до сель индексы соответствующих массивов i=0; %индекс массива cell1, раньше i использовалась в for, да так и осталась %Вот, собственно, сам алгоритм. Как оказалось, всё очень просто, но на его %написание лично я потратил очень много времени. Идёт цикл по первому массиву. Если строковые ячейки %равны, то производится запись в массив Ок и происходит переход к следующему значению в массиве cell2. Если число в первом массиве %меньше, чем во втором, то производится запись в массив be1, если %меньше(при условии, что массив cell2 не кончился), то пишется be2. При этом, после записи происходит переход к следующему значению cell2 %(если, конечно, не достигнут конец), а индекс первого массива остаётся неизменным. %Ну, а если второй массив всё же подошол к концу, то пишется be1. После цикла по %первому массиву идёт проверка, не осталось ли значений во втором массиве. %P.S. кто понял вышесказанное, тот молодец! while i<temp(1,1) i=i+1; if strcmp(cell1{i,2},cell2{indcell2,2}) indOk=indOk+1; Ok(indOk,1:3)=cell1(i,:); Ok(indOk,4)=cell2(indcell2,3); if indcell2<temp(2), indcell2=indcell2+1; end elseif cell1{i,1}<cell2{indcell2,1} indbe1=indbe1+1; be1(indbe1,:)=cell1(i,:); elseif and(cell1{i,1}>cell2{indcell2,1},indcell2<temp(2)) indbe2=indbe2+1; be2(indbe2,:)=cell2(indcell2,:); if cell1{i,1}>=cell2{indcell2,1},i=i-1;end if indcell2<temp(2), indcell2=indcell2+1; end else indbe1=indbe1+1; be1(indbe1,:)=cell1(i,:); end end if indcell2<=temp(2) be2((indbe2+1):(indbe2+1+temp(2)-indcell2),:)=cell2(indcell2:temp(2),:); end %Задание размерности выходных данных в соответствии с реальностью... Ok=Ok(1:indOk,:); be1=be1(1:indbe1,:); be2=be2(1:indbe2,:); end [/pre2]

Ответов - 1

Бутеноп: В принципе, тут важен алгоритм, при желании можно переписать на другой язык и для других исходных данных.



полная версия страницы