2017-11-11 111 views
1

我不明白为什么Schur的分解不适用于复杂矩阵。 我的测试程序是:复杂矩阵的Schur分解

M <- matrix(data=c(2-1i,0+1i,3-1i,0+1i,1+0i,0+1i,1+0i,1+1i,2+0i), nrow=3, ncol=3, byrow=FALSE) 
M 
S <- Schur(M) 
S 
(S$Q)%*%(S$T)%*%(solve(S$Q)) 

结果是:

> M 
    [,1] [,2] [,3] 
[1,] 2-1i 0+1i 1+0i 
[2,] 0+1i 1+0i 1+1i 
[3,] 3-1i 0+1i 2+0i 
> 
> S <- Schur(M) 
Warning message: 
In Schur(M) : imaginary parts discarded in coercion 
> 
> S 
$Q 
    [,1] [,2] [,3] 
[1,] 0 0.500 -0.866 
[2,] 1 0.000 0.000 
[3,] 0 0.866 0.500 

$T 
    [,1] [,2] [,3] 
[1,] 1 0.866 0.5000 
[2,] 0 3.732 -2.0000 
[3,] 0 0.000 0.2679 

$EValues 
[1] 1.0000 3.7321 0.2679 

> 
> (S$Q)%*%(S$T)%*%(solve(S$Q)) 
    [,1] [,2] [,3] 
[1,] 2 0 1 
[2,] 0 1 1 
[3,] 3 0 2 

这样Q*T*Q^{-1}不给m返回其真正复杂的形式... /说明我错过了什么代码,请?

+0

函数help说'Schur()需要数值方阵。然而,你在一个'cplx'方阵上使用它,然后强制为一个数字 - 简单地丢弃虚部。 – Eldioo

+0

当然有一个解决方案;这就是我正在询问的... – Andrew

回答

0

正如@艾尔迪奥的评论所说,Matrix::Schur只涉及真实的矩阵。对于复杂的矩阵,可以使用QZ包:

library(QZ) 
M <- matrix(data=c(2-1i,0+1i,3-1i,0+1i,1+0i,0+1i,1+0i,1+1i,2+0i), 
      nrow=3, ncol=3, byrow=FALSE) 
schur <- qz(M) 


> all.equal(M, schur$Q %*% schur$T %*% solve(schur$Q)) 
[1] TRUE 
> all.equal(M, schur$Q %*% schur$T %*% t(Conj(schur$Q))) 
[1] TRUE 
+0

哦,那是QZ。非常感谢你 ! – Andrew