旋转基础以对齐向量
Rotate a basis to align to vector
我有一个大小为 NxP
的矩阵 M
。每个 P
列都是正交的(M
是一个基础)。我还有一个向量 V
,大小为 N
。
我的objective是将M
的第一个向量变换成V
并更新其他向量以保持它们的正交性。我知道 V
和 M
的原点是一样的,所以基本上都是从某个角度旋转过来的。我假设我们可以找到一个矩阵 T
使得 T*M = M'
。但是,我无法弄清楚如何做的细节(使用 MATLAB)。
此外,我知道可能有无数个变换这样做,但我想得到最简单的一个(其中 M
的其他向量大致保持不变,即不围绕第一个向量旋转)。
一张小图来说明。在我的实际情况下,N
和 P
可以是大整数(不一定是 3):
在此先感谢您的帮助!
[编辑] Gram-Schmidt 的替代解决方案(已接受的答案)
我通过解决优化问题最小化 M
和 R*M
之间的 2 范数来检索旋转矩阵 R
,在以下约束下设法获得了正确的解决方案:
V
与 R*M[1] ... R*M[P-1]
正交(即 V'*(R*M[i]) = 0
)
R*M[0] = V
由于求解器的限制,我无法表明 R*M[0] ... R*M[P-1]
都是成对正交的 (i.e (R*M)' * (R*M) = I
)。
幸运的是,对于这个问题和我的求解器(使用 SDPT3 的 CVX),结果 R*M[0] ... R*M[P-1]
也是成对正交的。
我相信你想在这里使用 Gram-Schmidt 过程,它为一组向量找到正交基。如果 V
与 M[0]
不正交,您可以简单地将 M[0]
更改为 V
和 运行 Gram-Schmidt,以获得正交基。如果它与 M[0]
正交,则将另一个非正交向量(例如 M[1]
更改为 V
并交换列使其成为第一个。
请注意,向量 V
需要在 M
的列 space 中,否则您将始终拥有与以前不同的基础。
Matlab 没有内置的 Gram-Schmidt 命令,但您可以使用 qr
命令获得正交基。但是,如果您需要 V
作为向量之一,这将不起作用。
Option # 1 :如果你有一些向量并且在一些变化之后你想旋转矩阵以恢复它的正交性那么我相信这种方法应该适用于你在 Matlab
http://www.mathworks.com/help/symbolic/mupad_ref/numeric-rotationmatrix.html
(由另一位用户编辑:以上 link 已损坏,可能的重定向:Matrix Rotations and Transformations)
如果没有,那么...
选项#2:我没有在 Matlab 中执行此操作,但另一项任务的一部分是找到矩阵的特征值和特征向量。为此,我使用了 SVD。 SVD 算法的一部分是雅可比旋转。它说要旋转矩阵,直到它几乎可以以一定的精度和可逆的方式对角化。
你的雅可比旋转的近似算法应该和这个差不多。我在某些时候可能是错的,所以你需要在相关文档中仔细检查:
1) 更改现有向量中的值
2) 计算实际向量和新向量之间的角度
3) 创建旋转矩阵并...
- 将余弦(角度)放在旋转矩阵的对角线上
- 将 Sin(angle) 放在矩阵的左上角
- 将负-Sin(角度)放在矩阵的右下角
4) 多个向量或向量矩阵循环旋转矩阵直到你的向量矩阵可逆和可对角化,反转能力可以通过行列式计算(检查奇异性) 和正交性(矩阵对角化)可以用这个检查来测试——如果 LU 矩阵中的最大值小于某个常数然后停止旋转,此时新矩阵应该只包含正交向量。
不幸的是,我无法找到我过去所指的确切伪代码,但这些 link 可能会帮助您理解雅可比旋转:
我有一个大小为 NxP
的矩阵 M
。每个 P
列都是正交的(M
是一个基础)。我还有一个向量 V
,大小为 N
。
我的objective是将M
的第一个向量变换成V
并更新其他向量以保持它们的正交性。我知道 V
和 M
的原点是一样的,所以基本上都是从某个角度旋转过来的。我假设我们可以找到一个矩阵 T
使得 T*M = M'
。但是,我无法弄清楚如何做的细节(使用 MATLAB)。
此外,我知道可能有无数个变换这样做,但我想得到最简单的一个(其中 M
的其他向量大致保持不变,即不围绕第一个向量旋转)。
一张小图来说明。在我的实际情况下,N
和 P
可以是大整数(不一定是 3):
在此先感谢您的帮助!
[编辑] Gram-Schmidt 的替代解决方案(已接受的答案)
我通过解决优化问题最小化 M
和 R*M
之间的 2 范数来检索旋转矩阵 R
,在以下约束下设法获得了正确的解决方案:
V
与R*M[1] ... R*M[P-1]
正交(即V'*(R*M[i]) = 0
)R*M[0] = V
由于求解器的限制,我无法表明 R*M[0] ... R*M[P-1]
都是成对正交的 (i.e (R*M)' * (R*M) = I
)。
幸运的是,对于这个问题和我的求解器(使用 SDPT3 的 CVX),结果 R*M[0] ... R*M[P-1]
也是成对正交的。
我相信你想在这里使用 Gram-Schmidt 过程,它为一组向量找到正交基。如果 V
与 M[0]
不正交,您可以简单地将 M[0]
更改为 V
和 运行 Gram-Schmidt,以获得正交基。如果它与 M[0]
正交,则将另一个非正交向量(例如 M[1]
更改为 V
并交换列使其成为第一个。
请注意,向量 V
需要在 M
的列 space 中,否则您将始终拥有与以前不同的基础。
Matlab 没有内置的 Gram-Schmidt 命令,但您可以使用 qr
命令获得正交基。但是,如果您需要 V
作为向量之一,这将不起作用。
Option # 1 :如果你有一些向量并且在一些变化之后你想旋转矩阵以恢复它的正交性那么我相信这种方法应该适用于你在 Matlab
http://www.mathworks.com/help/symbolic/mupad_ref/numeric-rotationmatrix.html (由另一位用户编辑:以上 link 已损坏,可能的重定向:Matrix Rotations and Transformations)
如果没有,那么...
选项#2:我没有在 Matlab 中执行此操作,但另一项任务的一部分是找到矩阵的特征值和特征向量。为此,我使用了 SVD。 SVD 算法的一部分是雅可比旋转。它说要旋转矩阵,直到它几乎可以以一定的精度和可逆的方式对角化。
你的雅可比旋转的近似算法应该和这个差不多。我在某些时候可能是错的,所以你需要在相关文档中仔细检查:
1) 更改现有向量中的值
2) 计算实际向量和新向量之间的角度
3) 创建旋转矩阵并...
- 将余弦(角度)放在旋转矩阵的对角线上
- 将 Sin(angle) 放在矩阵的左上角
- 将负-Sin(角度)放在矩阵的右下角
4) 多个向量或向量矩阵循环旋转矩阵直到你的向量矩阵可逆和可对角化,反转能力可以通过行列式计算(检查奇异性) 和正交性(矩阵对角化)可以用这个检查来测试——如果 LU 矩阵中的最大值小于某个常数然后停止旋转,此时新矩阵应该只包含正交向量。
不幸的是,我无法找到我过去所指的确切伪代码,但这些 link 可能会帮助您理解雅可比旋转: