2015-03-25 5 views
0

У меня есть 3 набора данных (AA, B1 и C1) с разной длиной и размером. Цель моего кода - рассчитывать для оценки сходства между данными, например, оценкой подобия между AA и B1, AA и C1, B1 и C1. Итак, ниже мой код, который должен быть в состоянии вычислить оценку подобия, но есть немного проблем в циклах. Для каждой пары данных разной длины выбирается только самое высокое значение. Выход должен быть AA-B1: 0.2226, AA-C1: 0.2037 и B1-C1: 0.1111, которые представляют оценку подобия для каждой пары.Matlab Looping Issue для подсчета оценки подобия

В действительности вывод для моего кода, особенно max_val{i}, предполагается в соответствии с размером пар. Например, пары с размером 1 x 2 должны иметь одно значение в выводе max_val вместо трех. Благодарю.

A1={[4,3,4,3,3]}; 
A2={[3,1,2,4]}; 
A3={[1,2,4]}; 
AA=[A1,A2,A3]; 
B1={[2,2,4,4]}; 
C1={[4,4,4,3,2,2]}; 

set={[AA],[B1],[C1]}; 
comb_set=nchoosek(set,2); %combinations of two sets 

for h=1:size(comb_set,1) 
comb_pair=comb_set(h,:)'; 
sets=comb_pair; 

cat=horzcat(sets{:}); 
c=reshape(repmat(sets{1},numel(sets{2}),1),numel(sets{1})*numel(sets{2}),1); 
d=repmat(sets{2}(:),length(sets{1}),1); 
pairs=[c d]; 
ind=cellfun(@numel,pairs(:,1)) > cellfun(@numel,pairs(:,2)); 
pairs(ind,[1 2]) = pairs(ind,[2 1]) %possible pairs of the row of subset 
p=cell(size(pairs,1),1); 

for i=1:size(pairs,1) 
%the two vectors 
[a,b]=deal(pairs{i,:}); 
%sliding window indices, and compute the sum 
idx=hankel(1:numel(a),numel(a):numel(b)); 
count_minus{i}=bsxfun(@minus,b(idx.'),a); %count minus between pairs 
count_total{i}=numel(a)+numel(b); %count total 
count_intersect{i}=sum(count_minus{i}'==0)'; %count no. of intersection 
union{i}=count_total{i}-count_intersect{i}; %union 
subset{i}=count_intersect{i}./union{i}; %subset each pair similarity score 
max_val{i}=max(subset{i}) %maximum similarity score 
bsum=cellfun(@(x) sum(x),max_val); 
total{i}=sum(bsum~=0); 
average=sum(bsum)/total{i} 
end 
end 

ответ

1

У вас есть 2 для петель для i и h и использовать max_val{i} во внутреннем цикле. Это означает, что одна и та же структура ячейки max_val будет использоваться для каждого значения h - в этом случае size(comb_set,1)=3. Для каждой итерации hmax_val{i}, определенный в предыдущей итерации, будет перезаписан. Так как в первом и втором прогоне size(pairs,1)=3 ячейка будет иметь длину 3. В последнем size(pairs,1)=1. Ячейка будет по-прежнему иметь длину 3, но вы просто перезапишите первый элемент - вы можете посмотреть вывод кода, который вы указали, и увидеть, что последние два элемента равны последним двум предыдущим итерациям h. Вы должны определить по-разному max_val. Вы можете определить массив, чтобы сохранить максимальные значения в цикле i и записать его, например, в max_values{h}.

Если у вас есть подобные ошибки, проще создать минимальный рабочий пример и проверить, что случилось. Этот код довольно трудно прочитать, также из-за отсутствия отступов. CTRL + A и CTRL + Я делаю вашу жизнь намного легче.