Winkel zwischen zwei Vektoren in R
Was die effizienteste Art und Weise, in der Programmiersprache R zur Berechnung des Winkel zwischen zwei Vektoren?
InformationsquelleAutor der Frage Christian | 2009-12-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Entsprechend Seite 5 von dieses PDF
sum(a*b)
ist der R-Befehl, um das Skalarprodukt von Vektorena
undb
undsqrt(sum(a * a))
ist der R-Befehl, um die norm von Vektor -a
undacos(x)
ist der R-Befehl der arc-Cosinus. Daraus folgt, dass der R-code zur Berechnung der Winkel zwischen den beiden Vektoren istInformationsquelleAutor der Antwort las3rjock
Meine Antwort besteht aus zwei teilen. Teil 1 ist die Mathematik zu geben, Klarheit für alle Leser des Threads und machen Sie den R-code, der folgt, verständlich. Teil 2 ist, die R-Programmierung.
Teil 1 - Mathematik
Das Skalarprodukt von zwei Vektoren x und y kann definiert werden als:
||x|| ist die euklidische norm (auch bekannt als L2 - norm) des Vektors x.
Manipulation der definition des skalarprodukts können wir erhalten:
wo theta ist der Winkel zwischen den Vektoren x und y in Bogenmaß ausgedrückt. Beachten Sie, dass theta kann auf einen Wert, der liegt auf dem geschlossenen Intervall von 0 bis pi.
Lösung für die theta selbst, erhalten wir:
Teil 2 - R-Code
Übersetzung der Mathematik in R-code, müssen wir wissen, wie die Ausführung von zwei matrix (Vektor) - Berechnungen; Skalarprodukt und die euklidische norm (die eine bestimmte Art von norm, bekannt als die L2 - norm). Wir müssen auch wissen, die R entspricht der inversen Cosinus-Funktion cos-1.
Ausgehend von der Spitze. Durch den Verweis auf die
?"%*%"
das Skalarprodukt (auch bezeichnet als der innere Produkt) kann berechnet werden mit der%*%
Betreiber. Mit Verweis auf?norm
dienorm()
- Funktion (Basis-Paket) gibt eine norm eines Vektors. Die norm von Interesse ist hier die L2 - norm oder, in der Sprache der R-Hilfe-Dokumentation, die "Spektral" oder "2"-norm. Dies bedeutet, dass dietype
argument dernorm()
Funktion sollte gleich festgelegt werden"2"
. Schließlich die inverse Cosinus-Funktion in R ist, vertreten durch dieacos()
Funktion.Lösung
Ausgestattet, mit dem sowohl die Mathematik und die entsprechenden R-Funktionen, eine Prototyp-Funktion (das ist, nicht Produktions-standard) zusammengestellt werden können - mit dem Basis-Paket Funktionen - wie unten gezeigt. Wenn die genannten Informationen Sinn macht, dann die
angle()
Funktion, die folgt, sollte klar sein, ohne weiteren Kommentar.Testen Sie die Funktion
Einen test, um zu überprüfen, dass die Funktion funktioniert. Lassen Sie x = (2,1) und y = (1,2). Dot-Produkt zwischen x und y ist 4. Die euklidische norm von x ist sqrt(5). Die euklidische norm von y ist auch sqrt(5). cos-theta = 4/5. Theta ist etwa 0.643 Bogenmaß.
Ich hoffe, das hilft!
InformationsquelleAutor der Antwort Graeme Walsh
Für 2D-Vektoren, die den Weg in die akzeptierte Antwort, und andere diejenigen nicht berücksichtigen, die Orientierung (Vorzeichen) der Winkel (
angle(M,N)
ist das gleiche wieangle(N,M)
) und es gibt einen richtigen Wert nur für einen Winkel zwischen0
undpi
.Verwenden Sie die
atan2
- Funktion, um einen orientierten Winkel und einen korrekten Wert (modulo2pi
).Überprüfen Sie, dass
angle2
gibt den richtigen Wert:InformationsquelleAutor der Antwort Stéphane Laurent
Verwenden Sie das Skalarprodukt. Sagen Sie V₁ = (x₁, y₁, z₁) und V₂ = (x₂, y₂, z₂), dann ist das Skalarprodukt, das werde ich Kennzeichnen durch V₁·V₂, berechnet als
Was dies bedeutet ist, dass, dass die Summe angezeigt, auf der linken Seite ist gleich dem Produkt der absoluten Werte der Vektoren mal dem Kosinus des Winkels zwischen den Vektoren. der absolute Wert der Vektoren V₁ und V₂ berechnet als
So, wenn Sie neu anordnen der ersten Gleichung oben erhalten Sie
und Sie brauchen nur die arccos-Funktion (oder inverse Kosinus) cos(θ) um den Winkel.
Je nach Ihren arccos-Funktion, die Winkel können in Grad oder Bogenmaß.
(Für zweidimensionale Vektoren, vergessen Sie einfach die z-Koordinaten und machen die gleichen Berechnungen.)
Glück,
John Döner
InformationsquelleAutor der Antwort John R Doner
Andere Lösung : die Korrelation zwischen den beiden Vektoren ist gleich dem Cosinus des Winkels zwischen zwei Vektoren.
so kann der Winkel berechnet werden, indem
acos(cor(u,v))
InformationsquelleAutor der Antwort Mohamed
Ich denke, dass das, was Sie brauchen, ist ein inneres Produkt. Für zwei Vektoren
v,u
(inR^n
oder andere innere-Produkt Leerzeichen)<v,u>/|v||u|= cos(alpha)
. (warenalpha
ist der Winkel zwischen den Vektoren)weitere details finden Sie unter:
http://en.wikipedia.org/wiki/Inner_product_space
InformationsquelleAutor der Antwort Guy