计算两个向量之间的角度matlab
Calculate angle between two vectors matlab
如果这个问题看起来很基础,我很抱歉,但我在网上找不到好的答案。
我对矢量以及如何在 matlab 中使用它们有点困惑。目前我有以下三对坐标(x 和 y):人 1,人 1 和人 2 的未来位置。参见:The three points in a 2d view
现在我想计算 "the vector which goes from person 1 to person 2" 和 "the vector from person 1 to person 1 future" 之间的角度。我发现了一些可以对向量执行此操作的 matlab 函数,但我不确定我实际上是否为每个向量使用了正确的输入。
所以现在我的问题是如何使用这些坐标(以及它们之间的差异)来计算图像的角度?
Matlab Central 对您的问题给出了以下答案:
theta = atan2(norm(cross(a,b)),dot(a,b));
其中a
和b
是位置相减得到的向量
让我们这样称呼这些点:
(x1,y1)- 人 1,
(x2,y2)- 未来的人 1,
(x3,y3)- person2.
First_vec_angle=atan((y2-y1)/(x2-x1));
Second_vec_angle=atan((y3-y1)/(x3-x1));
Angle=Second_vec_angle-First_vec_angle;
我建议使用两个向量的点积的 属性。为了清楚起见,我也解释了有关数学的细节。如果您已经知道,请跳过它。
以下等式说明 属性.
u · v = |u||v|余弦θ
来源:
http://chortle.ccsu.edu/VectorLessons/vch07/vch07_8.html
数学细节
左边是点积。在二维情况下,u = [u1; u2] 和 v = [v1; v2]。然后点积将每个维度的元素相乘,然后求和。在这种情况下 u · v = u1*v1 + u2*v2.
在右侧,两个向量的范数相乘。二维向量的(欧几里德)范数被描述为向量 x 的 (x1^2 + x2^2)^(1/2)。
代码
现在我们讨论Matlab代码。我们需要一个函数来输出带有两个向量输入的 theta。
function theta = calcAngleBetweenVectors(u, v)
dotUV = dot(u, v);
normU = norm(u);
normV = norm(v);
theta = acos(dotUV/(normU * normV));
要改进您的功能,您应该检查有效输入。在这种情况下,这些必须是二维向量,尽管该函数也适用于二维。
编辑:感谢 Ander Biguri 指出点积中的错误。我不知道我在想什么
虽然 StefanM 的解决方案是一个很常见的解决方案,但实际上计算量很大,但最重要的是,不正确 当向量很小时 and/or 角度是接近 0 或 π——它实际上会导致角度略微为负,或略微超过 π。
因此,它给人一种错误的稳健感。
相反,我建议
theta = acos(min(1,max(-1, a(:).' * b(:) / norm(a) / norm(b) )));
在循环中 运行 时更健壮,更正确,速度提高 10 倍以上,外行无需文档也能理解,因为它仍然大部分符合 "classical" 公式。
人1坐标,(x1,y1)-未来人1,(x11,y11)-人2(x2,y2).
考虑 x11-x1=xa 和 y11-y1=ya 然后 x2-x1=xb 和 y2-y1=yb。
角度(vector.a,vector.b)=pi()/2*((1+sign(xa))(1-sign(ya^2)) -(1+符号(xb))(1-符号(yb^2)))
+pi()/4*((2+sign(xa))*sign(ya)-(2+sign(xb))*sign(yb))
+sign(xa*ya)*atan((abs(xa)-abs(ya))/(abs(xa)+abs(ya)))
-sign(xb*yb)*atan((abs(xb)-abs(yb))/(abs(xb)+abs(yb)))
对于 xa、ya、xb 和 yb 的任意值,公式给出从 0 到 2pi 的角度。
对于 xa=ya=0 和或 xb=yb=0,结果未定义。
如果这个问题看起来很基础,我很抱歉,但我在网上找不到好的答案。
我对矢量以及如何在 matlab 中使用它们有点困惑。目前我有以下三对坐标(x 和 y):人 1,人 1 和人 2 的未来位置。参见:The three points in a 2d view
现在我想计算 "the vector which goes from person 1 to person 2" 和 "the vector from person 1 to person 1 future" 之间的角度。我发现了一些可以对向量执行此操作的 matlab 函数,但我不确定我实际上是否为每个向量使用了正确的输入。
所以现在我的问题是如何使用这些坐标(以及它们之间的差异)来计算图像的角度?
Matlab Central 对您的问题给出了以下答案:
theta = atan2(norm(cross(a,b)),dot(a,b));
其中a
和b
是位置相减得到的向量
让我们这样称呼这些点: (x1,y1)- 人 1, (x2,y2)- 未来的人 1, (x3,y3)- person2.
First_vec_angle=atan((y2-y1)/(x2-x1));
Second_vec_angle=atan((y3-y1)/(x3-x1));
Angle=Second_vec_angle-First_vec_angle;
我建议使用两个向量的点积的 属性。为了清楚起见,我也解释了有关数学的细节。如果您已经知道,请跳过它。 以下等式说明 属性.
u · v = |u||v|余弦θ
来源: http://chortle.ccsu.edu/VectorLessons/vch07/vch07_8.html
数学细节
左边是点积。在二维情况下,u = [u1; u2] 和 v = [v1; v2]。然后点积将每个维度的元素相乘,然后求和。在这种情况下 u · v = u1*v1 + u2*v2.
在右侧,两个向量的范数相乘。二维向量的(欧几里德)范数被描述为向量 x 的 (x1^2 + x2^2)^(1/2)。
代码
现在我们讨论Matlab代码。我们需要一个函数来输出带有两个向量输入的 theta。
function theta = calcAngleBetweenVectors(u, v)
dotUV = dot(u, v);
normU = norm(u);
normV = norm(v);
theta = acos(dotUV/(normU * normV));
要改进您的功能,您应该检查有效输入。在这种情况下,这些必须是二维向量,尽管该函数也适用于二维。
编辑:感谢 Ander Biguri 指出点积中的错误。我不知道我在想什么
虽然 StefanM 的解决方案是一个很常见的解决方案,但实际上计算量很大,但最重要的是,不正确 当向量很小时 and/or 角度是接近 0 或 π——它实际上会导致角度略微为负,或略微超过 π。
因此,它给人一种错误的稳健感。 相反,我建议
theta = acos(min(1,max(-1, a(:).' * b(:) / norm(a) / norm(b) )));
在循环中 运行 时更健壮,更正确,速度提高 10 倍以上,外行无需文档也能理解,因为它仍然大部分符合 "classical" 公式。
人1坐标,(x1,y1)-未来人1,(x11,y11)-人2(x2,y2).
考虑 x11-x1=xa 和 y11-y1=ya 然后 x2-x1=xb 和 y2-y1=yb。
角度(vector.a,vector.b)=pi()/2*((1+sign(xa))(1-sign(ya^2)) -(1+符号(xb))(1-符号(yb^2)))
+pi()/4*((2+sign(xa))*sign(ya)-(2+sign(xb))*sign(yb))
+sign(xa*ya)*atan((abs(xa)-abs(ya))/(abs(xa)+abs(ya)))
-sign(xb*yb)*atan((abs(xb)-abs(yb))/(abs(xb)+abs(yb)))
对于 xa、ya、xb 和 yb 的任意值,公式给出从 0 到 2pi 的角度。
对于 xa=ya=0 和或 xb=yb=0,结果未定义。