Dav*_*vid 6 matlab algebra rotation matrix linear-algebra
我想在给定以下条件的 n 维空间中计算(nxn)旋转矩阵:
我认为数字 4(最终旋转点)是多余的,没有它也可以计算旋转矩阵。但我都有。
是否有已经实现它的 matlab 函数?我知道 n=3 (vrrotvec2mat)有一个函数。但是我没有找到一般n 的任何功能。如果没有这样的函数,这里的任何人都可以告诉我如何计算它以便我可以编写函数?
我什至不确定一般n是否有唯一的旋转矩阵。如果有多个,我不介意使用哪个旋转矩阵。
我将不胜感激任何帮助。
提前致谢!
第一个问题的答案是 AFAIK 没有用于构造 n 维旋转矩阵的内置 MATLAB 函数。
但是,以下论文中描述了一种有趣的方法:
阿奎莱拉、安东尼奥和里卡多·佩雷斯-阿吉拉。“一般的 n 维旋转。” (2004)。
基本上,给定一组基向量,它们通过计算旋转序列来描述旋转矩阵的构造,该序列将子空间的基向量与标准基的前 n-2 个轴所跨越的子空间对齐,然后它们应用所需的旋转并撤消标准基础对齐旋转以获得最终的旋转矩阵。
我实现了论文中描述的伪代码,稍微修改它以删除可选的平移分量和齐次坐标(不知道为什么这会成为旋转矩阵的一部分!)。我还改变了它来构造一个预乘旋转矩阵而不是一个后乘矩阵。即我们旋转的列向量x使用y = R*x。这与vrrotvec2mat用于 3 维旋转的约定相匹配。
v一个n乘n-2矩阵给出。theta以弧度给出。% Implementation of the Aguilera-Perez Algorithm.
% Aguilera, Antonio, and Ricardo Pérez-Aguila. "General n-dimensional rotations." (2004).
function M = rotmnd(v,theta)
n = size(v,1);
M = eye(n);
for c = 1:(n-2)
for r = n:-1:(c+1)
t = atan2(v(r,c),v(r-1,c));
R = eye(n);
R([r r-1],[r r-1]) = [cos(t) -sin(t); sin(t) cos(t)];
v = R*v;
M = R*M;
end
end
R = eye(n);
R([n-1 n],[n-1 n]) = [cos(theta) -sin(theta); sin(theta) cos(theta)];
M = M\R*M;
Run Code Online (Sandbox Code Playgroud)
我不确定这是否完全回答了您的问题,因为我相信有两个方向可以围绕子空间旋转(或者更多?我什至不知道如何考虑高维空间中的旋转)。在您的问题中,不清楚基向量的方向描述了旋转方向。
几乎可以肯定有一种优雅的方法来确定要使用哪个符号theta,但我认为您可以只用theta和计算旋转矩阵-theta,然后确定哪个正确地从您想要旋转的点到最终旋转点。
使用示例
等效于 vrrotvec2mat
>> R1 = rotmnd([1; 2; 3], pi/4)
R1 =
0.7280 -0.5251 0.4407
0.6088 0.7908 -0.0635
-0.3152 0.3145 0.8954
>> R2 = vrrotvec2mat([1; 2; 3; pi/4])
R2 =
0.7280 -0.5251 0.4407
0.6088 0.7908 -0.0635
-0.3152 0.3145 0.8954
Run Code Online (Sandbox Code Playgroud)
4 维旋转
>> v = [1 0;
0 1;
1 0;
0 1];
>> R = rotmnd(v, pi/4)
R =
0.8536 -0.3536 0.1464 0.3536
0.3536 0.8536 -0.3536 0.1464
0.1464 0.3536 0.8536 -0.3536
-0.3536 0.1464 0.3536 0.8536
>> x = [0; 0; 0; 1];
>> y = R*x
y =
0.3536
0.1464
-0.3536
0.8536
Run Code Online (Sandbox Code Playgroud)
有趣的笔记从论文中,主旋转的一般矩阵的定义似乎有误(转置)。这可以通过将等式 2 中的旋转矩阵(即 R_{1,2})与转置的通用主轴旋转矩阵的定义进行比较来观察到。在实现算法时,这个错误导致了一些“乐趣”。
PS一个非常相似的方法可以提供洞察力在:
Hanson, Andrew J.“N 维图形的 4 次旋转”。Graphics Gems V. 1995. 55-64。
我还没有仔细阅读这篇文章,但我可能会稍后回来阅读并学习一些东西。