Форум

им. Зелёного Батискафа

АвторСообщение



Зарегистрирован: 05.03.07
Откуда: Россия, Тюмень
ссылка на сообщение  Отправлено: 24.01.10 00:51. Заголовок: Сравнение списков в MatLab


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


Вопрос: Что это за белое вещество в птичьем дерьме?
Ответ: Это тоже птичье дерьмо.
Спасибо: 0 
Профиль Цитата Ответить
Ответов - 1 [только новые]





Зарегистрирован: 05.03.07
Откуда: Россия, Тюмень
ссылка на сообщение  Отправлено: 24.01.10 00:52. Заголовок: В принципе, тут важе..


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

Вопрос: Что это за белое вещество в птичьем дерьме?
Ответ: Это тоже птичье дерьмо.
Спасибо: 0 
Профиль Цитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  5 час. Хитов сегодня: 1
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет



Создай свой форум на сервисе Borda.ru
Текстовая версия