2011-03-17 45 views
5

Parece que la respuesta a esto debería ser simple, pero estoy perplejo. Tengo una matriz de matriz Nx3 donde las columnas 1st 1st y 3rd son las coordenadas X Y y Z del enésimo artículo. Quiero calcular la distancia desde el origen hasta el elemento. En una forma no vectorizada esto es fácil.¿Cómo calcular la longitud euclidiana de una matriz sin bucles?

distancia = norma ([x y z]);

o

distancia = sqrt (x^2 + y^2 + z^2);

Sin embargo, en forma vectorializada no es tan simple. Cuando pasa una matriz a la norma, ya no devuelve la longitud euclidiana.

distancia = norma (matriz); % No funciona

y

distancia = sqrt (x (:., 1) * x (:, 1) + y (:., 2) * y (:, 2) + z (:, 3). * Z (:, 3)); % solo parece desordenado

¿Hay una mejor manera de hacerlo?

Respuesta

14

Prueba esto:

 
>> xyz = [1 2 3; 4 5 6; 7 8 9; 2 8 4] 

xyz = 

    1  2  3 
    4  5  6 
    7  8  9 
    2  8  4 

>> distance = sqrt(sum(xyz.^2, 2)) 

distance = 

      3.74165738677394 
      8.77496438739212 
      13.9283882771841 
      9.16515138991168 
+0

muy elegante, por cierto! =) – Phonon

3

Sí, la hay.

distance = sqrt(sum(matrix.^2,2)); %# matrix is [x y z] 
0

Creo que el camino a seguir es distance = sqrt(matrix(:,1).^2+matrix(:,2).^2+matrix(:,3).^2).

Loops en Matlab son demasiado lentos. Las operaciones vectoriales son siempre preferidas (como estoy seguro que sabes). Además, usar .^2 (cuadratura de elementos) no tiene que mirar cada columna de su matriz dos veces, por lo que sería aún más rápido.

0

Usando h2O

h2o.init() 
df1<-as.h2o(matrix1) 
df2<-as.h2o(matrix2) 
distance<-h2o.distance(df1,df2,"l2") 
#l2 for euclidean distance 
Cuestiones relacionadas