计算两个向量matlab

时间:2016-11-07 09:01:11

标签: matlab vector angle

对不起,如果这个问题看起来很基本,但我还没能在网上找到一个好的答案。

我对矢量有点困惑,以及如何在matlab中使用它们。目前我有以下三对坐标(x和y):人1,人1和人2的未来位置。见:The three points in a 2d view

现在我想计算"从人1到人2"的矢量之间的角度。和#34;从人1到人1未来的矢量"。我发现了一些可以用向量做的matlab函数,但我不确定我实际上是在为每个向量使用正确的输入。

所以现在我的问题是如何使用这些坐标(以及它们之间的差异)来计算图像的角度?

5 个答案:

答案 0 :(得分:5)

尽管StefanM的解决方案是一种非常常见的解决方案,但实际上计算成本很高,但最重要的是,当矢量很小和/或角度接近0或π时,不正确 - 它实际上可以产生略微负或稍微超过π的角度。

因此,它给出了一种虚假的鲁棒感。 我反而建议

theta = acos(min(1,max(-1, a(:).' * b(:) / norm(a) / norm(b) )));

更强大,更正确,在循环中运行时速度超过10倍,而且没有文档可以理解,因为它仍然主要与“经典”公式一致。

答案 1 :(得分:2)

我建议使用两个向量的点积的属性。为清楚起见,我还解释了有关数学的详细信息。如果您已经知道它,请跳过它。 以下等式解释了该属性。

你·v = | u || v | cosθ

来源: http://chortle.ccsu.edu/VectorLessons/vch07/vch07_8.html

数学细节

左侧是点积。在2D情况下,u = [u1; u2]和v = [v1; V2]。然后,点积乘以每个维度的元素,然后求和。在这种情况下,因此u·v = u1 * v1 + u2 * v2。

在右侧,两个向量的范数成倍增加。对于向量x,2D向量的(欧几里德)范数被描述为(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));

要改善功能,您应该检查有效输入。在这种情况下,这些必须是2D矢量,尽管该功能也适用于2D。

编辑:感谢Ander Biguri指出点积中的错误。我不知道我在想什么

答案 2 :(得分:1)

Matlab Central给出了以下问题的答案:

 theta = atan2(norm(cross(a,b)),dot(a,b));

ab是通过减去位置获得的向量。

答案 3 :(得分:0)

让我们这样称呼: (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;

答案 4 :(得分:0)

人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 + sign(xb) )(1-sign(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,结果是不确定的。