Разложение Шура комплексной матрицы

Я не понимаю, почему разложение Шура не работает на сложной матрице. Моя программа для тестирования:

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 в его истинную сложную форму... Какой код/инструкции мне не хватает, пожалуйста?


person Andrew    schedule 11.11.2017    source источник
comment
В справке по функции сказано, что Schur() нужны numerical квадратных матрицы. Однако вы используете его на cplx квадратной матрице, которая затем приводится к числовой - просто отбрасывая мнимую часть.   -  person Eldioo    schedule 11.11.2017
comment
Наверняка есть решение этой проблемы; это я и спрашиваю...   -  person Andrew    schedule 11.11.2017


Ответы (1)


Как сказано в комментарии @Eldioo, 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
person Stéphane Laurent    schedule 11.11.2017
comment
О, так это был QZ. Большое спасибо ! - person Andrew; 11.11.2017