vectorise foor loop with a variable that is incremented in each iteration

Original question

It can be done with accumarray:

a = [1 4 2 2 1 3 4 2 3 1];
b = [0.5 0.2 0.3 0.4 0.1 0.05 0.7 0.3 0.55 0.8];
c = [3 5 7 9];
c(:) = c(:) + accumarray(a(:), b(:));

This sums the values from b in groups defined by a, and adds that to the original c.

Edited question

If b is a matrix, you can use

full(sparse(repmat(a, 1, size(b,1)), repelem(1:size(b,2), size(b,1)), b))

or

accumarray([repmat(a, 1, size(b,1)).' repelem(1:size(b,2), size(b,1)).'], b(:))

Matrix multiplication and implicit expansion and can be used (Octave):

nc = numel(c);
c += b * (1:nc == a.');

For input of large size it may be more memory efficient to use sparse matrix:

nc = numel(c);
nb = numel(b);
c += b * sparse(1:nb, a, 1, nb, nc);

Edit: When b is a matrix you can extend this solution as:

nc = numel(c);
na = numel(a);
out = sparse(a, 1:na, 1, nc, na) * b;