Question

Il semble que la réponse à ce qui devrait être simple, mais je suis perplexe. J'ai une matrice de la matrice NX3 où 1er 2e et 3e colonnes sont les X Y et Z du n-ième élément. Je veux calculer la distance entre l'origine de l'élément. Dans un non vectorisé forme c'est facile.

distance = norme ([x y z]);

ou

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

Cependant, sous forme vectorisée ne est pas si simple. Lorsque vous passez une matrice à la norme, il ne retourne 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 )); % Semble juste désordre

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

Était-ce utile?

La solution

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

Autres conseils

Oui, il y a.

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

Pour obtenir les normes de vecteurs d'une matrice

vecnorm( A, p, dim)

a été introduit dans Matlab 2017b. Pour la question compte tenu de la distance euclidienne (Norme L2), ensemble p = 2, et les opérations de ligne sage, ensemble dim = 2.

vecnorm( X, 2, 2)

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

Les boucles dans Matlab sont tout simplement trop lent. opérations vectorielles sont toujours préférées (comme je suis sûr que vous le savez). De plus, en utilisant .^2 (élévation au carré-élément par élément) ne pas regarder chaque colonne de votre matrice deux fois, ce serait encore plus rapide.

Utilisation h2O

h2o.init()
df1<-as.h2o(matrix1)
df2<-as.h2o(matrix2)
distance<-h2o.distance(df1,df2,"l2")
#l2 for euclidean distance
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top