Arrays 对矩阵中第一个元素匹配的行求和?
我有矩阵:Arrays 对矩阵中第一个元素匹配的行求和?,arrays,matlab,matrix,Arrays,Matlab,Matrix,我有矩阵: a=[1 2 2 3 1 5 3 4 2 9]; 我想通过将第一列元素匹配的第二列行相加来简化它。因此,上述矩阵a应为: a=[1 7 2 12 3 4]; 我不知道如何在功能上做到这一点,换句话说,没有for循环。谢谢大家! 使用和: 对于单线解决方案,您需要一个外部函数: function subs = unique3rdOutput( vec ) [~,~,subs] = unique(vec) 然后 out = [ unique
a=[1 2
2 3
1 5
3 4
2 9];
我想通过将第一列元素匹配的第二列行相加来简化它。因此,上述矩阵a
应为:
a=[1 7
2 12
3 4];
我不知道如何在功能上做到这一点,换句话说,没有for循环。谢谢大家! 使用和:
对于单线解决方案,您需要一个外部函数:
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)) ]
或者正如路易斯·门多所建议的:
out = [ (1:max(a(:,1))).' accumarray(a(:,1),a(:,2)) ]
[…]将第一列元素匹配的第二列行相加。请澄清/重新表述。我的意思是,如果第一列中的元素匹配,我想将行相加。例如,行
[12]
和[13]
应该加在一起(因为它们在第一列中都有1个),但是行[12]
和[24]
不应该加在一起(因为第一列中有1个,而另一列有2个…)我认为15
在您的示例输出中是错误的输出,是吗?非常感谢,编辑完成了。太棒了,在你最后的编辑中效果很好。我想知道,有没有可能直接使唯一
返回subs
,这样我就可以在一行上写下整个内容?我这样问只是出于好奇(我意识到这样做效率较低,因为我必须调用unique
两次,一次生成u
,一次生成subs
)因为它可能对我以后的一些应用程序有用。我不知道一个简单的解决方案可以把它放到一行中。@space_voyager如果你的第一列总是包含整数1,2,3,。。。(以任何顺序,但从1
开始,没有任何间隙)你不需要unique
,因此你可以有一行out=[(1:max(a(:,1))。”accumarray(a(:,1),a(:,2))]
@LuisMendo我的第一个答案是:out=[unique(a(:,1))accumarray(a(:,1)),a(:,2))
-但我编辑了它,因为它只适用于您提到的案例。它不在修订历史中,因为编辑来得很早。非常感谢这些建议!
out = [ (1:max(a(:,1))).' accumarray(a(:,1),a(:,2)) ]