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