Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 旋转基准以与矢量对齐_Matlab_Matrix_Rotation_Transform - Fatal编程技术网

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(角度)放到矩阵的右下角
4)循环中旋转矩阵的向量或向量矩阵的倍数,直到向量矩阵可逆且可对角化,可通过行列式(检查奇异性)和正交性(矩阵对角化)计算反转能力可通过此检查进行测试-如果LU矩阵中的最大值小于某个常数,则停止旋转,此时新矩阵应仅包含正交向量

不幸的是,我无法找到我在过去提到的确切伪代码,但这些链接可能有助于您理解雅可比旋转:

选项#1:如果您有一些向量,并且在进行一些更改后,您希望旋转矩阵以恢复其正交性,那么,我相信,这种方法在Matlab中应该适合您

(由其他用户编辑:上面的链接已断开,可能重定向:)

如果没有,那么

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

ca中Jacobi旋转的近似算法