如何用索引边缘化一个向量?

时间:2016-10-26 19:00:16

标签: matlab vectorization

我有这段代码:

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 - 循环?

1 个答案:

答案 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适用于。因为您正在使用行,所以我必须强制输入它们是列,这是(:)语法的目的。输出也将作为一列,因此如果您希望以行格式进行转置,则可以进行转置。