# How can I determine the angle between two vectors in MATLAB?

1.512 visualizzazioni (ultimi 30 giorni)
MathWorks Support Team il 22 Giu 2011
Commentato: Bruno Luong il 3 Dic 2022
How can I determine the angle between two vectors in MATLAB?
I have two vectors. Is there a MATLAB function that can determine the angle between them?

### Risposta accettata

MathWorks Support Team il 27 Mag 2020
Modificato: MathWorks Support Team il 27 Mag 2020
There is no in-built MATLAB function to find the angle between two vectors. As a workaround, you can try the following:
CosTheta = max(min(dot(u,v)/(norm(u)*norm(v)),1),-1);
ThetaInDegrees = real(acosd(CosTheta));
##### 5 CommentiMostra 3 commenti meno recentiNascondi 3 commenti meno recenti
Johannes Kalliauer il 3 Feb 2020
@MathWorks Support Team
u=[0.272379472472602111022302462516 1.08301805439555555910790149937 -0.359366773005409555910790149937];
v=[0.2898030626583580555111512312578 1.15229663744866689137553104956 -0.382354774507524222044604925031];
CosTheta = (dot(u,v) / (norm(u)*norm(v)));
if abs(CosTheta)>1
error('MATLAB:odearguments:NumericPrecision','Matlab has numerical issues in calculated angle')
end
leads to an error (imaginär angle), since CosTheta=1+2.22044604925031e-16>1
Solution would be
CosTheta = max(min(dot(u,v)/(norm(u)*norm(v)),1,-1);
ThetaInDegrees = real(acosd(CosTheta));
.
Akihumi il 27 Mag 2020
Hi, did you miss out a bracket for the min? I got an error and only resolve it with the following code instead.
CosTheta = max(min(dot(u,v)/(norm(u)*norm(v)),1),-1);
ThetaInDegrees = real(acosd(CosTheta));

Accedi per commentare.

### Più risposte (2)

Pierre-Pascal il 11 Gen 2016
So why doesn't matlab give us a function for that instead of having us look endlessly on forums?
##### 0 CommentiMostra -2 commenti meno recentiNascondi -2 commenti meno recenti

Accedi per commentare.

James Tursa il 9 Lug 2015
Modificato: James Tursa il 5 Gen 2019
This topic has been discussed many times on the Newsgroup forum ... if I looked hard enough I'm sure I could find several Roger Stafford posts from many years ago on this. E.g., here is one of them:
The basic acos formula is known to be inaccurate for small angles. A more robust method is to use both the sin and cos of the angle via the cross and dot functions. E.g.,
atan2(norm(cross(u,v)),dot(u,v));
An extreme case to clearly show the difference:
a =
1e-10
>> u = 4*[1 0 0] % arbitrary non-unit vector in X direction
u =
4 0 0
>> v = 5*[cos(a) sin(a) 0] % vector different from u by small angle
v =
5 5e-10 0
>> acos(dot(u,v)/(norm(u)*norm(v))) % acos formulation does not recover the small angle
ans =
0
>> atan2(norm(cross(u,v)),dot(u,v)) % atan2 formulation does recover the small angle
ans =
1e-10
##### 3 CommentiMostra 1 commento meno recenteNascondi 1 commento meno recente
James Tursa il 3 Feb 2020
To get a full circle result where "direction" of the angle is important, see this link for one possible strategy:
Bruno Luong il 3 Dic 2022
@Felix Fischer If you want to find angles of multiple vector pairs put in matrix, use vecnorm rather than norm.

Accedi per commentare.

### Categorie

Scopri di più su MATLAB in Help Center e File Exchange

R13SP1

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by