2015-03-25 56 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循環計數相似度分數問題

實際上,我的代碼的輸出,特別是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個爲ih循環和內循環使用max_val{i}。這意味着相同的max_val單元結構將用於h的每個值 - 在此例中爲size(comb_set,1)=3。對於h的每次迭代,上一次迭代中定義的max_val{i}將被覆蓋。由於在第一次和第二次運行size(pairs,1)=3該單元將有一個長度爲3.在最後一個size(pairs,1)=1。單元格的長度仍然爲3,但您只會覆蓋第一個元素 - 您可以查看您提供的代碼的輸出,並看到最後兩個元素與前一個迭代中的最後兩個元素相等。您需要以不同的方式定義max_val。例如,您可以定義一個數組以將最大值保留在i循環中,並將其寫入max_values{h}

當你有這樣的錯誤時,更容易生成一個最小的工作示例並檢查出現了什麼問題。這段代碼很難閱讀,也因爲缺少縮進。 CTRL + A和CTRL +我讓你的生活更輕鬆。