2,076 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 2 Feb 2016

There is no MATLAB function that can determine the angle between two vectors.

As a workaround, you can find the norm of the cross product using the CROSS function and the dot product using the DOT function and then find the four quadrant inverse tangent in degrees using the 'atan2d' function.

For example:

u = [1 2 0];

v = [1 0 0];

ThetaInDegrees = atan2d(norm(cross(u,v)),dot(u,v));

You can also divide the dot product of the two vectors obtained using the DOT function by the product of magnitudes of the two vectors (NORM function), to get the cosine of the angle between the two vectors. This does not work well for small angles.

For example:

u = [1 2 0];

v = [1 0 0];

CosTheta = dot(u,v)/(norm(u)*norm(v));

ThetaInDegrees = acosd(CosTheta);

For more information on the functions DOT, CROSS, , ACOSD, ATAN2D and NORM, refer the following URLs:

DOT:

CROSS:

ACOSD:

ATAN2D

NORM:

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

Sign in to comment.

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 at 15:05

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

Sign in to comment.

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.

Sign in to comment.

Daniel Vasilaky
on 9 Jul 2015

Edited: Walter Roberson
on 15 Sep 2015

acosd(CosTheta)

will give you the same answer.

Sign in to comment.

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

Sign in to comment.

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)))

Sign in to comment.

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.

Sign in to comment.

Sign in to answer this question.

Opportunities for recent engineering grads.

Apply Today
## 7 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

Sign in to comment.