【问题标题】:How to calculate a rotation matrix in n dimensions given the point to rotate, an angle of rotation and an axis of rotation (n-2 subspace)如何在给定旋转点、旋转角度和旋转轴(n-2 子空间)的情况下计算 n 维旋转矩阵
【发布时间】:2018-10-24 13:06:22
【问题描述】:

我想在 n 维空间中计算一个 (nxn) 旋转矩阵:

  1. 要旋转的点。
  2. 旋转角度。
  3. 旋转轴(一个 (n-2) 子空间,通过跨子空间的 (n-2) 个单位向量给出的原点。
  4. 最终旋转的点。

我认为数字 4(最终旋转点)是多余的,没有它也可以计算旋转矩阵。但我都有。

是否有已经实现它的 matlab 函数? 我知道 n=3 (vrrotvec2mat) 有一个函数。 但是我没有找到通用n的任何功能。 如果没有这样的函数,这里的任何人都可以告诉我如何计算它以便我可以编写函数?

我什至不确定一般 n 是否有唯一的旋转矩阵。如果有多个,我不介意使用哪个旋转矩阵。

我将不胜感激。

提前致谢!

【问题讨论】:

    标签: matlab matrix rotation linear-algebra algebra


    【解决方案1】:

    第一个问题的答案是 AFAIK,没有用于构建 n 维旋转矩阵的内置 MATLAB 函数。

    但是,以下论文中描述了一种有趣的方法:

    Aguilera, Antonio, and Ricardo Pérez-Aguila. "General n-dimensional rotations." (2004).

    基本上,给定一组基向量,它们通过计算旋转序列来描述旋转矩阵的构造,该旋转序列将子空间的基向量与标准基的前 n-2 个轴跨越的子空间对齐,然后他们应用所需的旋转并撤消标准基础对齐旋转以获得最终的旋转矩阵。

    我实现了论文中描述的伪代码,稍微修改它以删除可选的平移分量和齐次坐标(不知道为什么这会成为旋转矩阵的一部分!)。我还将它更改为构造一个预乘旋转矩阵而不是一个后乘矩阵。即我们使用y = R*x 旋转列向量x。这符合 vrrotvec2mat 用于 3 维旋转的约定。


    • 子空间的基础是v,它是一个n-by-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;
    

    我不确定这是否完全回答了您的问题,因为我相信围绕子空间旋转有两个方向(或者可能更多?我什至不知道如何考虑在更高维空间中的旋转)。在您的问题中,不清楚基向量的方向是否描述了旋转方向。

    几乎可以肯定,有一种优雅的方法可以确定 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
    

    4-d 旋转

    >> 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
    

    有趣的注释从论文看来,主旋转的通用矩阵的定义似乎有一个错误(它是转置的)。这可以通过将公式 2 中的旋转矩阵(即 R_{1,2})与转置的通用主轴旋转矩阵的定义进行比较来观察到。这个错误在实现算法时带来了一些“乐趣”。


    P.S. 一个非常相似的方法可以提供洞察力,如下所述:

    Hanson, Andrew J. "4 Rotations for N-Dimensional Graphics." Graphics Gems V. 1995. 55-64.

    我还没有仔细阅读这篇文章,但我可能稍后会回来阅读这篇文章并学到一些东西。

    【讨论】:

    • 这很有趣!谢谢!
    • 谢谢!我用许多 3D 示例尝试了您的代码。我将结果与我已经拥有的 3D 结果进行了比较,我得到了完全相同的旋转矩阵:)。没有看到θ符号有任何问题。我现在正在检查它的更高维度。谢谢!
    • 我曾尝试在 5D 中实现此功能,但失败了。作为v,我在 5D 中生成了 3 个正交向量。这是正确的吗?
    • @Omry 是的 v 应该是 3 级的 5x3 矩阵。当您说它不起作用时,您的意思是您得到的结果与预期不同,或者我提供的代码导致错误?
    • 很高兴你明白了:)
    【解决方案2】:

    如果您的正交向量 u 和 v 跨越 n-2 子空间的正交补集,或者换一种说法,如果 w(1) .. w(n-2) 是跨越 n-2 的向量子空间,如果你有向量 u 和 v 使得它们都与所有 w 正交,并且彼此正交且每个长度为 1,那么所需矩阵 M 的构造将是直截了当的。

    将 nx2 矩阵 P 定义为 u 作为它的第一列, v 作为它的第二列,并让 R 是通常的 2x2 旋转矩阵通过角度。 那么

    M = I + P*(R-i)*P'
    

    (这里我是 nxn 身份,我是 2x2 身份)

    (如果你愿意,我会扩展这个答案来论证为什么这是你需要的(唯一)矩阵)。

    如果你没有向量 u 和 v,那么棘手的部分将是它们。

    如果你有投影矩阵 Q 到你的 n-2 暗子空间,那么你可以通过找到 Q 的零空间的(正交)基来找到 u 和 v。但是这里有一个令人讨厌的细节。如果您使用 u, v 如上所述,您将获得一个“旋转矩阵”,而如果您交换它们,您将获得一个不同的“旋转矩阵”。我将旋转矩阵放在引号中,因为其中一个将具有行列式 1,因此是旋转,而另一个将具有行列式 -1。

    上面的矩阵将始终具有与 R 相同的行列式,正如使用 Sylvester's determinant identity 和 P'*P = i 的事实可以看出的那样。

    但是,它是否代表通过给定角度的旋转是相当模糊的。假设为正交补选择了不同的基,因此使用 2xn 矩阵 Q 而不是 P。由于它们表示同一空间的不同(正交)基,因此有一个 2x2 正交矩阵 S,即 Q = S*P。所以使用 Q 构造的矩阵是

    N = I + P*S'*(R-i)*S*P'
    

    如果事实上 S 是一个旋转,那么一切都很好,N 和 M 将是相同的。但是如果 S 有行列式 -1,例如

    S = ( 0 1 )
        ( 1 0 )
    

    然后

    S'*(R-i)*S = R'-i
    

    所以我们已经反转了旋转的角度!

    【讨论】:

    • 有趣!如果我错了,请纠正我,但是如果您将 n-2 正交基作为矩阵 W,那么您不能通过求解 W 的零空间来得出 u 和 v 吗?跨度>
    • @jodag 我添加了更多内容,希望能回答您的问题。
    • 谢谢!让我看看我是否明白。说 B 是我的 n x (n-2) 子空间(跨越轴子空间的 n 个正交向量)。并令 P=null(B) 表示,P 是 (n x 2) 的矩阵(与 B 中的所有向量正交且彼此正交的 2 个向量)。那么上面对M的计算会给我我需要的吗?澄清一下,我要旋转的点不一定与 B 正交。它可以是任何点。
    • @David 上面的计算可能会给你一个非旋转矩阵,因为 M 的确定可能是-1。如果发生这种情况,那么您需要交换 P 的列。
    猜你喜欢
    • 1970-01-01
    • 2017-06-13
    • 2014-11-30
    • 1970-01-01
    • 2013-02-07
    • 2014-10-28
    • 1970-01-01
    • 2020-10-02
    相关资源
    最近更新 更多