Supposons que j'ai deux matrices Nx2, Mx2 représentant respectivement N, M 2d vecteurs. Existe-t-il un moyen simple et efficace de calculer les distances entre chaque paire de vecteurs (n, m)?
La manière simple mais inefficace est bien sûr:
d = zeros(N, M);
for i = 1:N,
for j = 1:M,
d(i,j) = norm(n(i,:) - m(j,:));
endfor;
endfor;
La réponse la plus proche que j'ai trouvée est bsxfun
, utilisée comme ceci:
bsxfun(inline("x-y"),[1,2,3,4],[3;4;5;6])
ans =
-2 -1 0 1
-3 -2 -1 0
-4 -3 -2 -1
-5 -4 -3 -2
performance
octave
vectorization
Kelley van Evert
la source
la source
cartprod
, alors maintenant je peux écrire: (1)x = cartprod(n(:,1), m(:,1));
(2)y = cartprod(n(:,2), m(:,2));
(3)d = sqrt((x(:,1)-x(:,2)).^2+(y(:,1)-y(:,2)).^2)
..qui tourne beaucoup plus vite!Réponses:
La vectorisation est simple dans ces situations en utilisant une stratégie comme celle-ci:
Voici un exemple qui vectorise la boucle for avec une accélération de 15x pour M = 1000 et N = 2000.
la source
Depuis Octave 3.4.3 et versions ultérieures, l'opérateur - effectue la diffusion automatique (utilise bsxfun en interne). Vous pouvez donc procéder de cette manière.
Vous pouvez faire de même en utilisant une matrice 3D, mais je suppose que c'est plus clair. D est une matrice NxM de distances, chaque vecteur dans N contre chaque vecteur dans M.
J'espère que cela t'aides
la source