矢量化子阵列的添加

时间:2016-05-31 13:14:41

标签: arrays matlab matrix-indexing

假设我有两个(大)矢量SupplyLocationa=[0 0 0 0 0]相同大小和一个索引矢量b=[1 2 3 4 5],其值为{1,...,length(a) }。我想计算

ind=[1 5 2 1]

也就是说,我想将for k = 1:length(ind) a(ind(k)) = a(ind(k)) + b(ind(k)); end % a = [2 2 0 0 5] 中声明的b条目添加到ind,包括多重性。

a
当然,

要快得多,但忽略多次出现的索引。

如何加快上述代码的速度?

2 个答案:

答案 0 :(得分:5)

我们可以使用unique来标识唯一索引值,并使用第三个输出来确定ind的哪些元素共享相同的索引。然后,我们可以使用accumarray对共享相同索引的b的所有元素求和。然后,我们会在这些位置将这些值添加到a的原始值。

[uniqueinds, ~, inds] = unique(ind);
a(uniqueinds) = a(uniqueinds) + accumarray(inds, b(ind)).';

如果max(inds) == numel(a)可以将此简化为以下内容,因为accumarray只会为0中的任何缺失条目返回ind

a(:) = a(:) + accumarray(ind(:), b(ind));

答案 1 :(得分:3)

另一种基于accumarray的方法:

a(:) = a(:) + accumarray(ind(:), b(ind(:)), [numel(a) 1]);

工作原理

具有两个列向量作为输入的

accumarray聚合对应于第一个中的相同索引的第二输入的值。这里使用第三个输入来强制结果与a的大小相同,如果需要,用零填充。