我有这段代码:
A = [3,1,5,8]
B = [0, 0]
indexB = [1,2,2,1]
for i = 1:4
B(indexB(i)) = B(indexB(i)) + A(i)
end
所以,最后,我得到了
B = [11, 6]
我想知道我是否可以使用更有效的方式来总结而不是使用for
- 循环?
答案 0 :(得分:4)
经典使用accumarray
。只有这一次,您在A
中累积条目,然后在B
之上添加此条目,因为B
是求和的起点:
B = B(:); % Force into columns
B = B + accumarray(indexB(:), A(:));
accumarray
如何运作非常简单。您可以将其视为微缩MapReduce范例。简而言之,对于我们拥有的每个数据点,都有一个键和一个相关值。 accumarray
的目标是放置(或bin)属于同一个键的所有值,并对所有这些值执行某些操作。在我们的例子中,"键"将是indexB
中的值,其中每个元素都是索引到B
的位置。值本身来自A
。然后,我们希望将indexB
中属于每个位置的所有值加起来。值得庆幸的是,accumarray的默认行为是添加所有这些值。具体来说,accumarray的输出将是一个数组,其中每个位置计算映射到键的所有值的总和。例如,第一个位置是映射到键1的所有值的总和,第二个位置是映射到键2的所有值的总和,依此类推。
因为您使用B
作为起点,最终结果是从accumarray
获取求和结果并将其添加到B
之上,从而完成代码。< / p>
我必须指出accumarray
适用于列。因为您正在使用行,所以我必须强制输入它们是列,这是(:)
语法的目的。输出也将作为一列,因此如果您希望以行格式进行转置,则可以进行转置。