我有一个矩阵:
a=[1 2
2 3
1 5
3 4
2 9];
我希望通过将第一列元素匹配的行的第二列相加来简化它。因此,上述矩阵a
应变为:
a=[1 7
2 12
3 4];
我不知道如何在功能上实现这一点,换句话说,没有使用for循环。谢谢!
accumarray
和 unique
:[u,~,subs] = unique(a(:,1))
out = [ u, accumarray(subs,a(:,2)) ]
out =
1 7
2 12
3 4
对于一行代码的解决方案,您需要一个外部函数:
function subs = unique3rdOutput( vec )
[~,~,subs] = unique(vec)
接下来
out = [ unique(a(:,1)), accumarray(unique3rdOutput(a(:,1)),a(:,2)) ]
out = [ unique(a(:,1)) accumarray(a(:,1),a(:,2)) ]
或者按照Luis Mendo的建议:
out = [ (1:max(a(:,1))).' accumarray(a(:,1),a(:,2)) ]
1
开始且没有任何间隙),那么你就不需要使用unique
,因此你可以使用单行代码out = [ (1:max(a(:,1))).' accumarray(a(:,1),a(:,2)) ]
。 - Luis Mendoout = [ unique(a(:,1)) accumarray(a(:,1),a(:,2)) ]
- 但我将其编辑掉了,因为它只适用于你提到的情况。由于编辑太早,所以它没有出现在修订历史记录中。 - Robert Seifert
[1 2]
和[1 3]
应该被加在一起(因为两者都在第一列中有1),但是行[1 2]
和[2 4]
不应该被加在一起(因为一个在第一列中有1,而另一个在第一列中有2...) - space_voyager1 5
是错误的输出,不是吗? - Robert Seifert