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
声明的条目添加ind
到a
包括多重性.
a(ind)=a(ind)+b(ind);
% a = [1 2 0 0 5]
Run Code Online (Sandbox Code Playgroud)
当然要快得多,但忽略多次出现的指数.
我怎样才能加快上面的代码?
我们可以使用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)