2011-03-17 5 views
5

Il semble que la réponse à cette question devrait être simple, mais je suis perplexe. J'ai une matrice de matrice Nx3 où les 1er et 2ème colonnes sont les coordonnées X Y et Z du nième item. Je veux calculer la distance entre l'origine et l'objet. Dans une forme non vectorisée, c'est facile.Comment calculer la longueur euclidienne d'une matrice sans boucles?

distance = norme ([x y z]);

ou

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

Cependant, sous forme vectorisée ce n'est pas si simple. Lorsque vous passez une matrice à la norme, elle ne renvoie plus la longueur euclidienne.

distance = norme (matrice); % Ne fonctionne pas

et

distance = sqrt (x (:., 1) * x (:, 1) + y (:., 2) * y (:, 2) + z (:, 3). * Z (:, 3)); % juste semble malpropre

Y a-t-il une meilleure façon de le faire?

Répondre

14

Essayez ceci:

 
>> 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

Très élégant, en effet! =) – Phonon

3

Oui, il y a.

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

Je pense que le chemin à parcourir est distance = sqrt(matrix(:,1).^2+matrix(:,2).^2+matrix(:,3).^2).

Les boucles dans Matlab sont trop lentes. Les opérations vectorielles sont toujours préférées (comme vous le savez sûrement). De plus, en utilisant .^2 (équarissage par élément), vous n'avez pas besoin de regarder deux fois chaque colonne de votre matrice, ce serait donc encore plus rapide.

0

En utilisant h2O

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