Matlab – Incrementing one value of a MATLAB array multiple times in one line

arraysincrementMATLABvectorization

This is a question about incrementing one value of a MATLAB array multiple times in the same statement, without having to use a for loop.

I set my array as:

>> A = [10 20 30];

And then run:

>> A([1, 1]) = A([1, 1]) + [20 3]

A =

    13    20    30

Clearly the 20 is ignored. However, i would like it to be included, so that:

>> A = [10 20 30];
>> A([1, 1]) = A([1, 1]) + [20, 3]

would give:

A =

    33    20    30

Is there a function to allow this to be done in a nice, vectorised fashion?

(In reality, the indexing to the array would include multiple indexes, so it could be [1 1 2 2 1 1 1 1 3 3 3] etc., with an array of numbers to increment by (the [20, 3] above) of the same length.)

Best Answer

What you want to do can be done using the function ACCUMARRAY, like so:

A = [10 20 30];            %# Starting array
index = [1 2 2 1];         %# Indices for increments
increment = [20 10 10 3];  %# Value of increments
A = accumarray([1:numel(A) index].',[A increment]);  %'# Accumulate starting
                                                      %#   values and increments

And the output of this example should be:

A = [33 40 30];


EDIT: If A is a large array of values, and there are just a few increments to add, the following may be more computationally efficient than the above:

B = accumarray(index.',increment);  %'# Accumulate the increments
nzIndex = (B ~= 0);               %# Find the indices of the non-zero increments
A(nzIndex) = A(nzIndex)+B(nzIndex);  %# Add the non-zero increments