二维向量的叉积

Cross product of 2d vectors

我有两个坐标向量:

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

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

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

问题是在 MATLAB 中,二元向量不可能进行叉积。 运行 以下代码:

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.

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

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

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

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

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

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

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

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

现在您可以像使用普通函数一样使用它了。我认为这应该是关于操作数量和可重用性的理想解决方案。

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

与:

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

您可以使用行列式

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

注意到由于单位圆是逆时针定义的,因此在本例中角度将为负。同样使用行列式 mathematically/theoretically 是错误的,但是使用矩阵 2x2 结果是一样的。

将向量转换为复数并使用 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