我有两个坐标矢量:
coor1 = [4 2];
coor2 = [4.3589 1];
我想找到旋转角度,在数学上由等式给出:
其中分子是两个坐标对之间的叉积,分母是点积。
问题在于,在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
。
答案 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