我想计算两个矢量V = [Vx Vy Vz]
和B = [Bx By Bz]
之间的角度。
这个公式是否正确?
VdotB = (Vx*Bx + Vy*By + Vz*Bz)
Angle = acosd (VdotB / norm(V)*norm(B))
还有其他方法可以计算吗?
我的问题不是规范化载体或使其更容易。我问的是如何获得这两个向量之间的角度
答案 0 :(得分:15)
基于this link,这似乎是最稳定的解决方案:
atan2(norm(cross(a,b)), dot(a,b))
答案 1 :(得分: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;
答案 2 :(得分:0)
使用点运算符可以更快地计算VdotB
和任意长度的向量,即:
VdotB = sum(V(:).*B(:));
此外,正如评论中所提到的,matlab具有dot函数来直接计算内部产品。
除此之外,公式就是它,所以你所做的是正确的。
答案 3 :(得分: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
答案 4 :(得分:0)
solution of Dennis Jaheruddin非常适合3D矢量,对于高维矢量,我建议使用:
acos(min(max(dot(a,b)/sqrt(dot(a,a)*dot(b,b)),-1),1))
这解决了一些数字问题,这些问题可能会使acos的参数刚好大于1或小于-1。然而,当向量之一是零向量时,仍然存在问题。此方法还只需要3 * N + 1乘法和1 sqrt。但是,它还需要进行2个atan方法不需要的比较。