矢量化子阵列的添加

Jul*_*ian 4 arrays matlab matrix-indexing

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

for k = 1:length(ind)
    a(ind(k)) = a(ind(k)) + b(ind(k));
end
% a = [2 2 0 0 5]
Run Code Online (Sandbox Code Playgroud)

也就是说,我想将b声明的条目添加inda包括多重性.

a(ind)=a(ind)+b(ind);
% a = [1 2 0 0 5]
Run Code Online (Sandbox Code Playgroud)

当然要快得多,但忽略多次出现的指数.

我怎样才能加快上面的代码?

Sue*_*ver 5

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

[uniqueinds, ~, inds] = unique(ind);
a(uniqueinds) = a(uniqueinds) + accumarray(inds, b(ind)).';
Run Code Online (Sandbox Code Playgroud)

如果max(inds) == numel(a)那么这可以简化为以下内容,因为accumarray只会返回0任何缺少的条目ind.

a(:) = a(:) + accumarray(ind(:), b(ind));
Run Code Online (Sandbox Code Playgroud)