矢量化唯一列的总和

时间:2012-01-24 10:01:09

标签: arrays matlab matrix vectorization

在matlab的不同行中存在多个相同的值组合,例如在第一行和第二行中的11。我想删除所有这些重复项,但在第三列中添加值。在11的情况下它将是7.最后我想创建一个相似性矩阵,如下面的答案中所示。我不介意对角线中的2 *值,因为我不会在进一步的工作中考虑对角元素。下面的代码执行此操作但它没有矢量化。这可以以某种方式进行矢量化。实例如下。

datain = [ 1 1 3; 
       1 1 4; 
       1 2 5; 
       1 2 4; 
       1 2 3; 
       1 3 8; 
       1 3 7; 
       1 3 12; 
       2 2 22; 
       2 2 77;
       2 3 111;
       2 3 113;
       3 3 456;
       3 3 568];  
cmp1=unique(datain(:,1));
cmp1sz=size(cmp1,1);
cmp2=unique(datain(:,2));
cmp2sz=size(cmp2,1);
thetotal=zeros(cmp1sz,cmp2sz);

for i=1:size(datain,1)
 for j=1:cmp1sz
     for k=1:cmp2sz
         if datain(i,1)==cmp1(j,1) && datain(i,2)== cmp2(k,1)
             thetotal(j,k)=thetotal(j,k)+datain(i,3);
             thetotal(k,j)=thetotal(k,j)+datain(i,3);
         end
     end
 end
end 

答案是

14          12          27

12         198         224

27         224        2048

1 个答案:

答案 0 :(得分:4)

这是使用ACCUMARRAY的海报案例。

thetotal = accumarray(datain(:,1:2),datain(:,3),[],@sum,0);

%# to make the array symmetric, you simply add its transpose

thetotal = thetotal + thetotal'

thetotal =
          14          12          27
          12         198         224
          27         224        2048

修改

那么如果datain不包含整数值呢?在这种情况下,您仍然可以构建一个表,例如thetotal(1,1)datain(1,1:2) == [1 1]不对应,而是datain的前两列中的最小条目。

[uniqueVals,~,tmp] = unique(reshape(datain(:,1:2),[],1));
correspondingIndices = reshape(tmp,size(datain(:,1:2)));
thetotal = accumarray(correspondingIndices,datain(:,3),[],@sum,0);

[1 1]处的值现在对应[uniqueVals(1) uniqueVals(1)]前两个列中的行datain