%Функция сравнения двух массивов ячеек.
%
%Входные данные должны представлять собой массивы в три столбца.
%Первый столбец-ключи в цифровом представлении,
%второй-ключи в текстовом представлении,
%третий-значения.
%
%Выходные аргументы:
%Первый-содержит совпадающие значения
%второй-значения, встретившиеся только в первом массиве
%третий-значения, встретившиеся только во втором массиве.
%
%Синтаксис:
%[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