Wie berechnet man die euklidische Länge einer Matrix ohne Schleifen?
-
27-10-2019 - |
Frage
Es scheint, dass die Antwort darauf einfach sein sollte, aber ich bin ratlos. Ich habe eine Matrix von NX3 -Matrix, bei der die 1. 2. und 3. Spalten die XY- und Z -Koordinaten des n -ten Elements sind. Ich möchte den Abstand vom Ursprung zum Artikel berechnen. In einer nicht vektorisierten Form ist dies einfach.
Entfernung = Norm ([xyz]);
oder
Entfernung = sqrt (x^2+y^2+z^2);
In vektorisierter Form ist es jedoch nicht so einfach. Wenn Sie eine Matrix übergeben, um zu normieren, gibt sie die euklidische Länge nicht mehr zurück.
Entfernung = Norm (Matrix); %funktioniert nicht
und
Entfernung = SQRT (x (:, 1).*x (:, 1)+y (:, 2).*y (:, 2)+z (:, 3).*Z (:, 3)); %scheint einfach unordentlich zu sein
Gibt es einen besseren Weg, dies zu tun?
Lösung
Versuche dies:
>> 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
Andere Tipps
Ja da ist.
distance = sqrt(sum(matrix.^2,2)); %# matrix is [x y z]
Um die Normen von Vektoren einer Matrix zu erhalten
vecnorm( A, p, dim)
wurde in Matlab 2017b eingeführt. Für die angegebene Frage die euklidische Entfernung (L2-Norm), setzen Sie P = 2 und zeilenweise Operationen, dim = 2.
vecnorm( X, 2, 2)
Ich denke, der Weg zu gehen ist distance = sqrt(matrix(:,1).^2+matrix(:,2).^2+matrix(:,3).^2)
.
Schleifen in Matlab sind einfach zu langsam. Vektoroperationen werden immer bevorzugt (wie Sie sicher wissen). Zusätzlich verwendet .^2
(Element-Wise Quadring) muss nicht jede Spalte Ihrer Matrix zweimal nachsehen, daher wäre dies noch schneller.
Mit H2O
h2o.init()
df1<-as.h2o(matrix1)
df2<-as.h2o(matrix2)
distance<-h2o.distance(df1,df2,"l2")
#l2 for euclidean distance