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

2.507 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?

Accepted Answer

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

Sign in to comment.

More Answers (10)

Pierre-Pascal
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
William Chamberlain on 27 Jul 2016
Agreed: it is a very standard function to perform, and a strange omission from Matlab's function set.

Sign in to comment.


James Tursa
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
  4 Comments

Sign in to comment.


Gabor Bekes
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
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
Daniel Vasilaky on 9 Jul 2015
Edited: Walter Roberson on 15 Sep 2015
acosd(CosTheta)
will give you the same answer.

Boris Povazay
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) )
  2 Comments
Jan
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.

Sign in to comment.


theodore panagos
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
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.

Ibrahim Asiri
Ibrahim Asiri on 7 Nov 2020
Write a Matlab script that:  Read the coordinates xA and yA of a point A
 Read the coordinates xB and yB of a point B 
Compute the distance d between points A and B using the following formula
𝑑 = √(𝑥𝐴 − 𝑥𝐵) 2 + (𝑦𝐴 − 𝑦𝐵) 2
Note: Use the Matlab function sqrt
  1 Comment
James Tursa
James Tursa on 7 Nov 2020
Please open up a new Question on this, and then delete this "Answer" since it doesn't belong on this thread.

Sign in to comment.


Ibrahim Asiri
Ibrahim Asiri on 7 Nov 2020
Write a Matlab script that:  Read the side a of a right triangle
 Read the side c of a right triangle
 Compute the side c of the right triangle using the following formula
𝑏 = √𝑐 2 − 𝑎 2
Note: Use the Matlab function sqrt
  1 Comment
James Tursa
James Tursa on 7 Nov 2020
Please open up a new Question on this, and then delete this "Answer" since it doesn't belong on this thread.

Sign in to comment.


Mahaveer Singh
Mahaveer Singh on 2 May 2021
Edited: Mahaveer Singh on 4 May 2021
function angle_in_degrees = vector2angle(u,v)
a= sqrt(u(1)^2+u(2)^2+u(3)^2);
b=sqrt(v(1)^2+v(2)^2+v(3)^2);
c=0;
for i=1:1:numel(u)
c=c+u(i)*v(i);
end
angle_in_degrees=acos(c/(a*b))*180/pi
end
  3 Comments
Mahaveer Singh
Mahaveer Singh on 4 May 2021
%other one is
function angle_in_degrees = vector2angle(u,v)
a= sqrt(u(1)^2+u(2)^2+u(3)^2);
b=sqrt(v(1)^2+v(2)^2+v(3)^2);
angle_in_degrees=acos(dot(u,v)/(a*b))*180/pi
end

Sign in to comment.

Products


Release

R13SP1

Community Treasure Hunt

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

Start Hunting!

Translated by