在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
答案 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
。