2d向量的叉积

时间:2019-09-11 13:11:53

标签: matlab vector geometry coordinates cross-product

我有两个坐标矢量:

coor1 = [4 2];
coor2 = [4.3589 1];

我想找到旋转角度,在数学上由等式给出:

enter image description here

其中分子是两个坐标对之间的叉积,分母是点积。

问题在于,在MATLAB中,使用2元素向量不可能产生叉积。运行以下代码:

ang = atan2(norm(cross(coor1,coor2)),dot(coor1,coor2));

产生此错误:

Error using cross
A and B must be of length 3 in the dimension in which the cross product is taken. 

有什么方法可以使cross工作?手工计算,两个坐标的旋转角度应为13.6441

5 个答案:

答案 0 :(得分:4)

将向量转换为复数并使用angle

x=coor1 * [1; 1i];
y=coor2 * [1; 1i];
ang = angle(x*y')

可以转换多个向量的其他向量化解决方案:

atan2(coor1 * (coor2(:,[2,1]).*[1 -1]).',coor1 * coor2.')

*感谢@ Dev-iL,我将i更改为1i

答案 1 :(得分:3)

您可以在向量后附加零以使其成为3D,然后从法向向量中获取第3个元素:

n = cross([coor1 0], [coor2 0]);
theta = atan2(n(3),dot(coor1,coor2));

答案 2 :(得分:3)

为什么不使用反余弦(arccos)?

coor1 = [4 2];
coor2 = [4.3589 1];

% normalize the vectors:
d1 = coor1 ./ norm(coor1);
d2 = coor2 ./ norm(coor2);

ang = acosd(dot(d1,d2));

答案 3 :(得分:3)

使用:

x = [4 2];
y = [4.3589 1];

您可以使用行列式

ang = atan2d(det([x;y]),dot(x,y))

注意到由于单位圆是逆时针定义的,因此在此示例中,角度将为负。在数学上/理论上也使用行列式是错误的,但是对于矩阵2x2,结果是相同的。

答案 4 :(得分:2)

我建议您像我的评论中那样使用匿名函数直接实现它:

cross2 = @(coor1,coor2)(coor2(2)*coor1(1)-coor2(1)*coor1(2))

现在,您可以像正常功能一样使用它。我认为这应该是有关操作数量的理想解决方案,同时也是可重用性的解决方案。

atan2d(cross2(coor1,coor2),dot(coor1,coor2)) % Thanks @Dev-iL