【问题标题】:Rotate a basis to align to vector旋转基础以与矢量对齐
【发布时间】:2015-08-18 06:45:56
【问题描述】:

我有一个大小为NxP 的矩阵M。每个P 列都是正交的(M 是一个基础)。我还有一个大小为N 的向量V

我的目标是将M 的第一个向量转换为V 并更新其他向量以保持它们的正交性。我知道VM的出处是一样的,所以基本上都是从某个角度旋转。我假设我们可以找到一个矩阵T,这样T*M = M'。但是,我无法弄清楚如何做到这一点的细节(使用 MATLAB)。

另外,我知道这样做的转换可能是无限的,但我想得到最简单的转换(其中M 的其他向量大致保持不变,ie没有围绕第一个向量旋转)。

一张小图来说明。在我的实际情况下,NP 可以是大整数(不一定是 3):

提前感谢您的帮助!

[编辑] Gram-Schmidt 的替代解决方案(接受的答案)

我通过解决一个优化问题,在约束条件下最小化MR*M 之间的 2 范数,检索了一个旋转矩阵 R,从而获得了正确的解决方案:

  • VR*M[1] ... R*M[P-1] 正交( V'*(R*M[i]) = 0
  • R*M[0] = V

由于求解器的限制,我无法指出 R*M[0] ... R*M[P-1] 都是成对正交的( (R*M)' * (R*M) = I)。

幸运的是,似乎对于这个问题和我的求解器(使用 SDPT3 的 CVX),生成的 R*M[0] ... R*M[P-1] 也是成对正交的。

【问题讨论】:

    标签: matlab matrix rotation transform


    【解决方案1】:

    我相信您想在这里使用Gram-Schmidt 过程,它为一组向量找到正交基。如果VM[0] 不正交,您只需将M[0] 更改为V 并运行Gram-Schmidt,即可得出正交基。如果它与M[0] 正交,则将另一个非正交向量(例如M[1])更改为V,并交换列以使其成为第一个。

    请注意,向量 V 需要在 M 的列空间中,否则您将始终拥有与以前不同的基础。

    Matlab 没有内置的 Gram-Schmidt 命令,尽管您可以使用 qr 命令获得正交基。但是,如果您需要 V 作为向量之一,这将不起作用。

    【讨论】:

    • 谢谢,但这种方法并不能保证M[1] ... M[P-1] 与轮换前的状态非常相似。这是我真正需要的属性,因为我只是想根据我知道V 应该等于M[0] 的事实来纠正M 上的近似错误。
    • 如果您将 M[0] 更改为 V 并运行 Gram-Schmidt,如果只是很小的变化,其他向量应该保持几乎相同。
    • 你是对的,它工作得很好。尽管如此,它还是取决于我们执行投影的顺序,因此并不(总是)提供最小旋转。但是,我开始认为实现起来太复杂了。
    【解决方案2】:

    选项#1:如果你有一些向量并且在一些改变之后你想旋转矩阵以恢复它的正交性,那么我相信这个方法应该适用于你在 Matlab 中

    http://www.mathworks.com/help/symbolic/mupad_ref/numeric-rotationmatrix.html (由其他用户编辑:以上链接已损坏,可能重定向:Matrix Rotations and Transformations

    如果没有,那么...

    选项#2:我在 Matlab 中没有这样做,但另一项任务的一部分是找到矩阵的特征值和特征向量。为了实现这一点,我使用了 SVD。 SVD 算法的一部分是 Jacobi Rotation。它说要旋转矩阵,直到它几乎可以对角化并具有一定的精度和可逆性。

    https://math.stackexchange.com/questions/222171/what-is-the-difference-between-diagonalization-and-orthogonal-diagonalization

    在您的情况下,雅可比旋转的近似算法应该与这个相似。我在某些时候可能是错的,所以您需要在相关文档中仔细检查:

    1)改变现有向量中的值

    2)计算实际向量和新向量之间的角度

    3) 创建旋转矩阵并...

    • 将余弦(角度)放入旋转矩阵的对角线
    • 将 Sin(angle) 放到矩阵的左上角
    • 将减号 -Sin(角度) 放到矩阵的右下角

    4) 多个向量或向量矩阵在循环中通过旋转矩阵,直到你的向量矩阵可逆且可对角化,反转能力可以通过行列式(检查奇异性)和正交性(矩阵被对角化)可以用这个检查来测试 - 如果 LU 矩阵中的最大值小于某个常数然后停止旋转,此时新矩阵应该只包含正交向量。

    不幸的是,我无法找到我过去所指的确切伪代码,但这些链接可能会帮助您理解 Jacobi Rotation:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 2022-08-21
      相关资源
      最近更新 更多