Suponha que você tenha esta matriz
>> 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
E você deseja adicionar 1
cada coordenada. Se for a mesma coordenada, será +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
Se eu usarsub2ind
>> 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
Mas se eu usar indexação normal
>> 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
Se você olhar com atenção, há a 2
dentro da matriz P
, mas não dentro da matriz P
acima.
Pergunta:
Por que sub2ind
a indexação difere da indexação normal P(i, j)
?
A diferença surge porque há um par de coordenadas repetidas (marcadas em negrito aqui):
Na
sub2ind
versão, o par repetido de coordenadas faz comindices
que tenha um valor repetido. A linhaP(indices) = P(indices)+1;
adiciona apenas1
uma vez a essa entrada deP
. Isso não está relacionadoind2sub
, é apenas a forma como a atribuição indexada funciona: as alterações não são "acumuladas" , portanto, uma entrada repetida atua sobre o valor original , sem levar em conta as ocorrências anteriores da mesma entrada. Por exemplo:Ou, talvez de forma mais clara, observe como o valor
50
é inútil aqui:Por outro lado, na
for
versão você acumula explicitamente as alterações, portanto, se uma entrada aparecer duas vezes, você adiciona1
duas vezes a essa entrada.