# Assignment with Repeated Indices

I have had customers ask me occasionally about what happens during an indexed assignment when indices are repeated. The answer is that it depends on how you do the assignment.

### Repeated Indices with a Single Assignment

I initialize an output matrix to zeros and create two vectors, one with locations (indices) and one for the corresponding data. Now let's look at the results of an indexed assignment.

A = zeros(3);
loc = [1 3 7 9 1];
data = 1:5;
A(loc) = A(loc) + data
A =
5     0     3
0     0     0
2     0     4


You see in this case that even though index 1 was repeated, its output value is only 5, and not 6. Let me reset A so I can show you what's going on.

A = zeros(3);

Here's what "essentially" happens during an assignment in MATLAB. On the right-hand side, A(loc) is created.

A(loc)
ans =
0     0     0     0     0


This means that there are 2 copies of A(1) currently and an element of data will be added to each of these. The important thing to realize is that now the values for the right-hand side have been calculated and set.

A(loc) + data
ans =
1     2     3     4     5


Following this, the 5-element right-hand side is assigned into A(loc) on the left-hand side. Values are currently placed into the output vector by marching down the left-hand side locations, replacing one element at a time. So the first element gets replaced not once, but twice, with the final one being the value that you see.

A(loc) = A(loc) + data
A =
5     0     3
0     0     0
2     0     4


### Repeated Indices Using a for Loop for the Assignment

Here's another way to do the assignment, but in this case, the

B = zeros(3);
for n = 1:length(loc)
B(loc(n)) = B(loc(n)) + data(n);
end
B
B =
6     0     3
0     0     0
2     0     4


Notice that the output here for B does not match that from the vectorized assignment above. This is because the values for the right-hand side get updated one at a time, and can therefore accumulate as additions made to a particular index.

isequal(A,B)
ans =
0


### Using accumarray to Accumulate Results with Repeated Indices

What if you want the accumulation effect, but you'd prefer to use vectorized code? That's what the function accumarray is for.

C = accumarray(loc',data,[9 1]);
C = reshape(C,[3 3])
C =
6     0     3
0     0     0
2     0     4


We see the same results here as those from the for loop example.

isequal(B,C)
ans =
1


### Repeated Index Usage

Did you know this about MATLAB already? I'm curious to hear your experiences in this area. Post them here.

Published with MATLAB® 7.4

|