Hadi GhahremanNezhad
Hadi GhahremanNezhad

Reputation: 2445

Matlab - How to perform operations on each row between two matrices?

I have two matrices each of which contains two vectors (each row is a vector):

u = [1 0 0; 2 0 0]
v = [1 1 0; 2 2 0]

I want to calculate two angles between the vectors of the corresponding rows in the matrices (angle between [1 0 0] , [1 1 0] and angle between [2 0 0] , [2 2 0]). In this example, both angles will be 45 degrees. So what I want is a new matrix like this:

angles = [45; 45]

When I try this:

u = [1 0 0; 2 0 0]
v = [1 1 0; 2 2 0]
dp = u(:,1) .* v(:,1) + u(:,2) .* v(:,2) + u(:,3) .* v(:,3);
angles = atan2d(norm(cross(u,v)),dp)

The anwser will be:

angles = [76.3670 ; 45.8683]

and when I try this (change norm to normr):

u = [1 0 0; 2 0 0]
v = [1 1 0; 2 2 0]
dp = u(:,1) .* v(:,1) + u(:,2) .* v(:,2) + u(:,3) .* v(:,3);
angles = atan2d(norm(crossr(u,v)),dp)

The anwser will be:

angles = [0 0 45.0000 ; 0 0 14.0362]

How can I make it calculate the angle between the vectors of each row?

Upvotes: 0

Views: 202

Answers (1)

Thales
Thales

Reputation: 1316

Try:

u=[1 0 0;2 0 0];
v = [1 1 0;2 2 0];
atan2(cross(u,v,2),dot(u,v,2)) % radians
atan2d(cross(u,v,2),dot(u,v,2)) % degrees

The ,2 in the cross and dot functions specifies the dimension to operate, since you are storing each vector in a row.

There a discussion here, with many other ways to calculate, and you may find one more suitable to your particular case of application.

Upvotes: 2

Related Questions