假设我有两个(大)矢量SupplyLocation
和a=[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
当然,要快得多,但忽略多次出现的索引。
如何加快上述代码的速度?
答案 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
的大小相同,如果需要,用零填充。