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
a=[0 0 0 0 0]
b=[1 2 3 4 5]
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]
That is, I want to add those entries bdeclared in ind, in a, including plurality.
b
ind
a
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?
unique , , ind . accumarray b, . a .
unique
accumarray
[uniqueinds, ~, inds] = unique(ind); a(uniqueinds) = a(uniqueinds) + accumarray(inds, b(ind)).';
max(inds) == numel(a), , accumarray 0 ind.
max(inds) == numel(a)
0
a(:) = a(:) + accumarray(ind(:), b(ind));
, accumarray:
a(:) = a(:) + accumarray(ind(:), b(ind(:)), [numel(a) 1]);
accumarray , , . , , a, .