Assume that you have this matrix
>> P = zeros(8, 12)
P =
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
And you want to add 1 on each coordinate. If it's the same coordinate, it will be +1.
>> angles = [1 2 1 3 3 2 5 6 2 1 3 8]
angles =
1 2 1 3 3 2 5 6 2 1 3 8
>> r = [1 2 4 2 5 6 1 4 6 6 3 6]
r =
1 2 4 2 5 6 1 4 6 6 3 6
If I use sub2ind
>> indices = sub2ind(size(P), angles, r);
>> P(indices) = P(indices) + 1;
>> P
P =
1 0 0 1 0 1 0 0 0 0 0 0
0 1 0 0 0 1 0 0 0 0 0 0
0 1 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0
But if I using normal indexing
>> for k = 1:length(r)
P(angles(k), r(k)) = P(angles(k), r(k)) + 1;
end
>> P
P =
1 0 0 1 0 1 0 0 0 0 0 0
0 1 0 0 0 2 0 0 0 0 0 0
0 1 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0
If you look closely, there is a 2 inside the matrix P, but not inside the matrix P above.
Question:
Why does sub2ind indexing differ from regular P(i, j) indexing?
The difference arises because there is a pair of coordinates repeated (marked in boldface here):
angles = [1 2 1 3 3 𝟐 5 6 𝟐 1 3 8]
r = [1 2 4 2 5 𝟔 1 4 𝟔 6 3 6]
In the sub2ind version, the repeated pair of coordinates causes indices to have a repeated value. The line P(indices) = P(indices)+1; only adds 1 once to that entry of P. This is not related to ind2sub, it's just the way indexed assignment works: the changes are not "accumulated", so a repeated entry acts on the original value, without regard of previous occurrences of the same entry. For example:
>> x = [10 20 30];
ind = [2 3 3];
x(ind) = x(ind)+1
x =
10 21 31
Or, perhaps more clearly, note how the value 50 is useless here:
>> x = [10 20 30];
>> x([2 3 3]) = [40 50 60]
x =
10 40 60
On the other hand, in the for version you explicitly accumulate the changes, so if an entry appears twice you add 1 twice to that entry.