我有一个大小为M
的矩阵NxP
。每个P
列都是正交的(M
是基础)。我还有一个大小为V
的向量N
。
我的目标是将M
的第一个向量转换为V
并更新其他向量以保护它们的正交性。我知道V
和M
的起源是相同的,所以它基本上是从某个角度的旋转。我假设我们可以找到T
矩阵T*M = M'
。但是,我无法弄清楚如何操作的细节(使用MATLAB)。
另外,我知道可能会有无数的变换这样做,但我想得到最简单的变换(其中M
的其他向量大致保持不变, ie 第一个向量周围没有旋转。)
一张小图片来说明。在我的实际情况中,N
和P
可以是大整数(不一定是3):
提前感谢您的帮助!
我设法通过在约束条件下解决最小化R
和M
之间的2范数的优化问题来检索旋转矩阵R*M
来获得正确的解决方案:
V
与R*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]
也是成对正交的。
答案 0 :(得分:2)
我相信你想在这里使用Gram-Schmidt过程,它找到一组向量的正交基础。如果V
与M[0]
不正交,您只需将M[0]
更改为V
并运行Gram-Schmidt即可获得正交基础。如果它与M[0]
正交,则将另一个非正交向量(例如M[1]
)更改为V
并交换列以使其成为第一个。
请注意,向量V
需要位于M
的列空间中,否则您将始终拥有与之前不同的基础。
尽管您可以使用qr
命令获得正交基础,但Matlab没有内置的Gram-Schmidt命令。但是,如果您需要V
成为其中一个向量,这将无法奏效。
答案 1 :(得分:2)
选项#1 :如果你有一些矢量,经过一些改变你想要旋转矩阵来恢复它的正交性,我相信,这个方法应该适合你在Matlab
http://www.mathworks.com/help/symbolic/mupad_ref/numeric-rotationmatrix.html
如果没有,那么......
选项#2 :我没有在Matlab中这样做,但另一项任务的一部分是找到矩阵的特征值和特征向量。为此,我使用了SVD。 SVD算法的一部分是Jacobi Rotation。它说要旋转矩阵,直到它几乎可以对角化,具有一定的精度和可逆性。
在你的情况下雅可比旋转的近似算法应该类似于这个。我可能在某些方面错了,所以你需要在相关的文档中仔细检查一下:
1)更改现有向量中的值
2)计算实际和新矢量之间的角度
3)创建旋转矩阵......
4)通过循环中的旋转矩阵直到矢量矩阵是可逆和可对角化的多个向量或矢量矩阵,可以通过行列式(检查奇点)和正交性(矩阵)计算反转能力可以通过此检查来测试 - 如果LU矩阵中的最大值小于某个常数然后停止旋转,此时新矩阵应仅包含正交矢量。
不幸的是,我无法找到过去所指的确切伪代码,但这些链接可能会帮助您理解Jacobi Rotation: