2013-08-20 6 views
4

Я хочу рассчитать угол между двумя векторами V = [Vx Vy Vz] и B = [Bx By Bz]. Эта формула правильная?Угол между двумя векторами Matlab

VdotB = (Vx*Bx + Vy*By + Vz*Bz) 

Angle = acosd (VdotB/norm(V)*norm(B)) 

и есть ли способ рассчитать его?

Мой вопрос не для нормализации векторов или его упрощения. Я спрашиваю о том, как получить угол между этими двумя векторами

+0

Кажется, больше математики вопроса, чем вопрос программирования. –

+1

В зависимости от вашего языка, вы должны добавить круглые скобки, чтобы убедиться, что продукт оценивается перед делением. Если оценить слева направо, это будет неверно. – Teepeemm

ответ

14

на основе this link, это, кажется, наиболее устойчивое решение:

atan2(norm(cross(a,b)), dot(a,b)) 
+1

Вот почему я смущен, и я не знаю, какой из них правильный, и почему –

+2

Просто прочитайте больше по моей ссылке. Они оба правильны в теории, но на практике это упоминается для обеспечения более стабильных результатов (в то время как альтернатива с 'acos' вычисляется немного быстрее). –

0

Вы можете вычислить VdotB гораздо быстрее, и для векторов произвольной длины с помощью оператора точки, а именно:

VdotB = sum(V(:).*B(:)); 

Кроме того, как уже упоминалось в комментариях , matlab имеет функцию dot для непосредственного вычисления внутренних продуктов.

Кроме того, формула является тем, что она делает, так что вы делаете правильно.

+4

Если вы хотите быть кратким, по крайней мере, рекомендуем 'V * B'' –

+1

Есть ли какая-то причина, по которой вы избежали внутренней функции' dot'? –

+0

@HighPerformanceMark Не забывайте о его существовании. –

0

Эта функция должна возвращать угол в радианах.

function [ alpharad ] = anglevec(veca, vecb) 
% Calculate angle between two vectors 
alpharad = acos(dot(veca, vecb)/sqrt(dot(veca, veca) * dot(vecb, vecb))); 
end 

anglevec([1 1 0],[0 1 0])/(2 * pi/360) 
>> 45.00 
1

Есть много вариантов:

a1 = atan2(norm(cross(v1,v2)), dot(v1,v2)) 
a2 = acos(dot(v1, v2)/(norm(v1) * norm(v2))) 
a3 = acos(dot(v1/norm(v1), v2/norm(v2))) 
a4 = subspace(v1,v2) 

Все формулы из this mathworks thread. Говорят, что a3 является наиболее стабильным, но я не знаю почему.

Для нескольких векторов хранятся в столбцах матрицы, можно рассчитать углы, используя этот код:

% Calculate the angle between V (d,N) and v1 (d,1) 
% d = dimensions. N = number of vectors 
% atan2(norm(cross(V,v2)), dot(V,v2)) 
c = bsxfun(@cross,V,v2); 
d = sum(bsxfun(@times,V,v2),1);%dot 
angles = atan2(sqrt(sum(c.^2,1)),d)*180/pi; 
Смежные вопросы