二维向量的叉积
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
。
我有两个坐标向量:
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
。