Comment calculer la longueur euclidienne d'une matrice sans boucles?
-
27-10-2019 - |
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?
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