2,300 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));

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?

William Chamberlain
on 27 Jul 2016

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 % start with a very small angle

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

Johannes Kalliauer
on 14 Jan 2020

Thanks, sometimes even imaginäry Angles occur if using acos-function.

James Tursa
on 3 Feb 2020

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)

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

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.

Opportunities for recent engineering grads.

Apply Today
## 10 Comments

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/101590-how-can-i-determine-the-angle-between-two-vectors-in-matlab#comment_297309

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/101590-how-can-i-determine-the-angle-between-two-vectors-in-matlab#comment_297309

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/101590-how-can-i-determine-the-angle-between-two-vectors-in-matlab#comment_297320

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/101590-how-can-i-determine-the-angle-between-two-vectors-in-matlab#comment_297320

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/101590-how-can-i-determine-the-angle-between-two-vectors-in-matlab#comment_570609

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/101590-how-can-i-determine-the-angle-between-two-vectors-in-matlab#comment_570609

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/101590-how-can-i-determine-the-angle-between-two-vectors-in-matlab#comment_571702

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/101590-how-can-i-determine-the-angle-between-two-vectors-in-matlab#comment_571702

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/101590-how-can-i-determine-the-angle-between-two-vectors-in-matlab#comment_639733

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/101590-how-can-i-determine-the-angle-between-two-vectors-in-matlab#comment_639733

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/101590-how-can-i-determine-the-angle-between-two-vectors-in-matlab#comment_709523

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/101590-how-can-i-determine-the-angle-between-two-vectors-in-matlab#comment_709523

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/101590-how-can-i-determine-the-angle-between-two-vectors-in-matlab#comment_786018

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/101590-how-can-i-determine-the-angle-between-two-vectors-in-matlab#comment_786018

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/101590-how-can-i-determine-the-angle-between-two-vectors-in-matlab#comment_792963

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/101590-how-can-i-determine-the-angle-between-two-vectors-in-matlab#comment_792963

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/101590-how-can-i-determine-the-angle-between-two-vectors-in-matlab#comment_867093

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/101590-how-can-i-determine-the-angle-between-two-vectors-in-matlab#comment_867093

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/101590-how-can-i-determine-the-angle-between-two-vectors-in-matlab#comment_868138

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/101590-how-can-i-determine-the-angle-between-two-vectors-in-matlab#comment_868138

Sign in to comment.