7

我想计算 2 个向量V = [Vx Vy Vz]和之间的角度B = [Bx By Bz]。这个公式正确吗?

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

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

还有其他计算方法吗?

我的问题不是为了规范化向量或使其更容易。我在问如何获得这两个向量之间的角度

4

6 回答 6

16

基于此链接,这似乎是最稳定的解决方案:

atan2(norm(cross(a,b)), dot(a,b))
于 2013-08-20T08:39:49.083 回答
2

有很多选择:

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)

此 mathworks 线程中的所有公式。据说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;
于 2016-04-29T13:16:48.353 回答
0

This function should return the angle in radians.

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
于 2015-03-29T23:29:31.530 回答
0

您可以VdotB使用点运算符更快地计算任意长度的向量,即:

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

此外,如评论中所述,matlab 具有直接计算内积的dot函数。

除此之外,公式就是这样,所以你正在做的是正确的。

于 2013-08-20T08:35:13.003 回答
0

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 方法不需要。

于 2020-01-08T13:14:06.093 回答
0

获得两个向量之间的角度的传统方法(即arccos(dot(u, v) / (norm(u) * norm(v))),如其他一些答案中所述)在几个极端情况下存在数值不稳定性。以下代码适用于n维和所有极端情况(它不检查零长度向量,但这很容易添加)。请参阅下面的注释。

% Get angle between two vectors
function a = angle_btw(v1, v2)

    % Returns true if the value of the sign of x is negative, otherwise false.
    signbit = @(x) x < 0;

    u1 = v1 / norm(v1);
    u2 = v2 / norm(v2);

    y = u1 - u2;
    x = u1 + u2;

    a0 = 2 * atan(norm(y) / norm(x));

    if not(signbit(a0) || signbit(pi - a0))
        a = a0;
    elseif signbit(a0)
        a = 0.0;
    else
        a = pi;
    end;

end

此代码改编自 Jeffrey Sarnoff 的Julia 实现(MIT 许可),又基于W. Kahan 教授的这些注释(第 15 页)。

于 2022-01-20T16:40:52.057 回答