假设我有两个相同长度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循环?
答案 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);