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

2.025 views (last 30 days)
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?

MathWorks Support Team on 27 May 2020
Edited: MathWorks Support Team on 27 May 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));

Johannes Kalliauer on 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 on 27 May 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));
Dan Hendrickson on 27 May 2020
Akihumi,
Thanks for pointing that out, I have updated the MathWorks answer.
Best,
Dan

Pierre-Pascal on 11 Jan 2016
So why doesn't matlab give us a function for that instead of having us look endlessly on forums?

#### 1 Comment

William Chamberlain on 27 Jul 2016
Agreed: it is a very standard function to perform, and a strange omission from Matlab's function set.

James Tursa on 9 Jul 2015
Edited: James Tursa on 5 Jan 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

Show 1 older comment
meenakshi on 4 Jan 2019
thank u, i used in color vector in ycbcr space. It is very iseful to me
Johannes Kalliauer on 14 Jan 2020
Thanks, sometimes even imaginäry Angles occur if using acos-function.
James Tursa on 3 Feb 2020
To get a full circle result where "direction" of the angle is important, see this link for one possible strategy:

Gabor Bekes on 15 Sep 2016
Edited: Gabor Bekes on 15 Sep 2016
This does the same thing, also capable of determining the angle of higher (than one) dimensional subspaces.
subspace(vector1,vector2)

#### 1 Comment

Aras on 3 May 2018
This method needs to be used carefully because it provides an angle between 0 and π/2 radians, instead of between 0 and π.
E.g., the angle between vectors [1, 0] and [-1, 0] are given as 0, while the result is expected to be π, considering their opposite directions.

Daniel Vasilaky on 9 Jul 2015
Edited: Walter Roberson on 15 Sep 2015
acosd(CosTheta)
will give you the same answer.

Boris Povazay on 17 Jun 2018
Just a note on how to vectorize the whole thing: (semicolons purposely omitted to see the intermediate results)
u = [1 2 0];
v = [1 0 0];
C=cross(u,v)
NC=norm(C)
D=dot(u,v)
ThetaInDegrees = atan2d(NC,D)
Rep=5
uf = repmat(u,5,1)
vf = repmat(v,5,1)
vC=cross(uf,vf,2) %vectorized
vNC=vecnorm(vC,2,2) % since only z-rotation is allowed anyway, this is equivalent to: vNC=vC(:,3)
vD=dot(uf,vf,2)
vThetaInDegrees = mean(atan2d(vNC,vD))
or in short (the hard to read variant)
VThetaInDegrees =atan2d( vecnorm(cross(Vu,Vv,2),2,2) , dot(Vu,Vv,2) )

Boris Povazay on 17 Jun 2018
One more thing to mention: this calculation takes the norm and therefore is not the solution to the question: angle between vectors! - It is rather the angle between unoriented vectors. The solution to the question rather should result in [-180:+180] to distinguish the orientation of the angle. - It is mentioned here.
-> So how can this be rewritten without loosing the orientation due to the norm?
Jan on 17 Jun 2018
@Boris Povazay: I do not agree. The range of [-180, 180] is meaningful in the 2D case only. In 3D (and higher dimensions) the sign of the angle cannot be defined, because it would depend on the direction of view. You need a third vector to define the direction of view to get the information about the sign. Therefore the answer is correct: In the general case the angle between two vectors is the included angle: 0 <= angle <= 180.

theodore panagos on 29 Oct 2018
Coordinates of two vectors xb,yb and xa,ya .
angle(vector.b,vector.a)=pi/2*((1+sgn(xa))*(1-sgn(ya^2))-(1+sgn(xb))*(1-sgn(yb^2)))
+pi/4*((2+sgn(xa))*sgn(ya)-(2+sgn(xb))*sgn(yb))
+sgn(xa*ya)*atan((abs(xa)-abs(ya))/(abs(xa)+abs(ya)))
-sgn(xb*yb)*atan((abs(xb)-abs(yb))/(abs(xb)+abs(yb)))

Adana Mason on 28 Nov 2019
(a) Find parametric equations for the line of intersection of the planes and (b) find the angle
between the planes. 3? − 2? + ? = 1, 2? + ? − 3? = 3.