累积求和向量分量由Matlab中的一次运行中的另一个向量决定

时间:2014-12-12 18:20:20

标签: matlab vector

假设我有两个相同长度v1=[a,b,c,d,e,f]v2=[1,1,2,3,3,3]的向量,(a,b,c,d,e,f是一些数字)。我想创建另一个向量,其中第一个组件的组件按照第二个组合进行求和和排序。所以上面的结果应该是 result=[a+b,c,d+e+f]。我希望这是不言自明的。是否可以一步完成,而不是通过for循环?

3 个答案:

答案 0 :(得分:2)

您可以使用sparse作为行索引乘以构造为v2的矩阵:

v1 * sparse( 1:numel( v2 ), v2, ones( size( v2 ) ) )

要深入了解这是做什么的,您可以检查矩阵本身:

M = sparse( 1:numel( v2 ), v2, ones( size( v2 ) ) )
full( M )

显示为:

ans =

 1     0     0
 1     0     0
 0     1     0
 0     0     1
 0     0     1
 0     0     1

然后记住,矩阵乘法的工作原理是将行(在这种情况下为v1的单行)映射到每列上,并按列顺序对产品求和。

答案 1 :(得分:2)

完全 accumarray所做的事情:

result = accumarray(v2(:), v1(:));

答案 2 :(得分:1)

你可以使用arrayfun虽然它认为它使用了循环,但是在编译时它仍然比自己编写循环更快:

 vec=unique(v2);
 result=arrayfun(@(x) sum(v1(v2==x)), vec);