Supongamos que tengo dos matrices Nx2, Mx2 que representan N, M 2d vectores respectivamente. ¿Hay una manera simple y buena de calcular distancias entre cada par de vectores (n, m)?
La manera fácil pero ineficiente es, por supuesto:
d = zeros(N, M);
for i = 1:N,
for j = 1:M,
d(i,j) = norm(n(i,:) - m(j,:));
endfor;
endfor;
La respuesta más cercana que he encontrado es bsxfun
, usada así:
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
fuente
fuente
cartprod
, así que ahora puedo escribir: (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)
... ¡que funciona mucho más rápido!Respuestas:
Vectorizar es sencillo en estas situaciones utilizando una estrategia como esta:
Aquí hay un ejemplo que vectoriza el ciclo for con una aceleración de 15x para M = 1000 y N = 2000.
fuente
Desde Octave 3.4.3 y posterior, el operador realiza transmisiones automáticas (usa bsxfun internamente). Entonces puedes proceder de esta manera.
Puedes hacer lo mismo usando una matriz 3D, pero supongo que esto es más claro. D es una matriz de distancias NxM, cada vector en N contra cada vector en M.
Espero que esto ayude
fuente