Vectorization of adding a subarray

Let's say I have two (large) of the vector a=[0 0 0 0 0]and b=[1 2 3 4 5]the same size and one index vector ind=[1 5 2 1]with values in {1, ..., length (a)} . I would like to calculate

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

That is, I want to add those entries bdeclared in ind, in a, including plurality.

a(ind)=a(ind)+b(ind);
% a = [1 2 0 0 5]

much faster, but ignores indexes that appear several times.

How can I speed up the above code?

+4
source share
2 answers

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));
+5

, accumarray:

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

accumarray , , . , , a, .

+3

All Articles