Matlab 旋转基准以与矢量对齐
我有一个矩阵Matlab 旋转基准以与矢量对齐,matlab,matrix,rotation,transform,Matlab,Matrix,Rotation,Transform,我有一个矩阵M,大小NxP。每个P列都是正交的(M是基础)。我还有一个向量V,大小N 我的目标是将M的第一个向量转换为V,并更新其他向量以保持其正交性。我知道V和M的原点是相同的,所以它基本上是从某个角度旋转的。我假设我们可以找到一个矩阵T,这样T*M=M'。然而,我无法弄清楚如何(使用MATLAB)实现它的细节 另外,我知道可能有无限多个变换可以这样做,但我想得到最简单的一个(在这个变换中,M的其他向量大致保持不变,即没有围绕第一个向量旋转) 要说明的小图片。在我的实际情况中,N和P可以是大整
M
,大小NxP
。每个P
列都是正交的(M
是基础)。我还有一个向量V
,大小N
我的目标是将M
的第一个向量转换为V
,并更新其他向量以保持其正交性。我知道V
和M
的原点是相同的,所以它基本上是从某个角度旋转的。我假设我们可以找到一个矩阵T
,这样T*M=M'
。然而,我无法弄清楚如何(使用MATLAB)实现它的细节
另外,我知道可能有无限多个变换可以这样做,但我想得到最简单的一个(在这个变换中,M
的其他向量大致保持不变,即没有围绕第一个向量旋转)
要说明的小图片。在我的实际情况中,N
和P
可以是大整数(不一定是3):
提前感谢您的帮助
[编辑]Gram Schmidt的替代解决方案(接受答案)
我设法通过检索旋转矩阵R
获得正确的解决方案,通过解决一个优化问题,最小化M
和R*M
之间的2-范数,在约束条件下:
与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]
也是成对正交的。我相信您想在这里使用这个过程,它为一组向量找到正交基。如果
V
与M[0]
不正交,只需将M[0]
更改为V
并运行Gram Schmidt,即可获得正交基。如果它与M[0]
正交,则将另一个非正交向量(如M[1]
更改为V
)并交换列以使其成为第一个向量
请注意,向量V
需要位于M
的列空间中,否则您将始终拥有与以前不同的基础
Matlab没有内置的Gram-Schmidt命令,尽管可以使用
qr
命令获得正交基。但是,如果您需要V
作为向量之一,则这将不起作用。我相信您希望在这里使用这个过程,它为一组向量找到正交基。如果V
与M[0]
不正交,只需将M[0]
更改为V
并运行Gram Schmidt,即可获得正交基。如果它与M[0]
正交,则将另一个非正交向量(如M[1]
更改为V
)并交换列以使其成为第一个向量
请注意,向量V
需要位于M
的列空间中,否则您将始终拥有与以前不同的基础
Matlab没有内置的Gram-Schmidt命令,尽管可以使用qr
命令获得正交基。但是,如果您需要V
作为向量之一,这将不起作用。选项#1:如果您有一些向量,并且在进行一些更改后,您希望旋转矩阵以恢复其正交性,那么我相信,这种方法在Matlab中应该适合您
(由其他用户编辑:上面的链接已断开,可能重定向:)
如果没有,那么
选项#2:我没有在Matlab中这样做,但另一项任务的一部分是找到矩阵的特征值和特征向量。为了实现这一点,我使用了SVD。SVD算法的一部分是Jacobi旋转。它说旋转矩阵,直到它几乎可以对角化,并且具有一定的精度和可逆性
在你们的例子中,雅可比旋转的近似算法应该和这个类似。我可能在某些时候出错,因此您需要在相关文档中再次检查:
1)更改现有向量中的值
2)计算实际矢量和新矢量之间的角度
3)创建旋转矩阵并
- 将余弦(角度)放在旋转矩阵的对角线上
- 将Sin(角度)放在矩阵的左上角
- 将-Sin(角度)放到矩阵的右下角