8

行列があり、対角化可能かどうかを知りたいです。Rプログラミング言語でこれを行うにはどうすればよいですか?

4

4 に答える 4

7

与えられた行列mがある場合、1つの方法は、固有ベクトルに固有値の対角線を掛け、元の行列の逆行列を掛けることです。これで元のマトリックスが返されます。Rでは次のようになります。

m <- matrix( c(1:16), nrow = 4)
p <- eigen(m)$vectors
d <- diag(eigen(m)$values)
p %*% d %*% solve(p)
m

したがって、その例p %*% d %*% solve(p)では、と同じである必要がありますm

于 2009-07-26T01:14:56.270 に答える
4

完全なアルゴリズムを実装して、行列がヨルダン型または対角型に縮小されるかどうかを確認できます (たとえば、このドキュメントを参照)。または、簡単で汚い方法を取ることもできます。n 次元の正方行列の場合、eigen(M)$values を使用して、それらが n 個の異なる値であることを確認します。乱数行列の場合、これで常に十分です。縮退には確率 0 があります。

PS: 以下の JD Long による簡単な観察に基づいて、対角化可能性の必要十分条件は、固有ベクトルが元の空間にまたがることであると思い出しました。これを確認するには、固有ベクトル行列がフル ランク (ゼロ固有値なし) であることを確認します。コードは次のとおりです。

diagflag = function(m,tol=1e-10){
    x = eigen(m)$vectors
    y = min(abs(eigen(x)$values))
    return(y>tol)
}
# nondiagonalizable matrix 
m1 = matrix(c(1,1,0,1),nrow=2) 
# diagonalizable matrix
m2 = matrix(c(-1,1,0,1),nrow=2) 

> m1
     [,1] [,2]
[1,]    1    0
[2,]    1    1

> diagflag(m1)
[1] FALSE

> m2
     [,1] [,2]
[1,]   -1    0
[2,]    1    1

> diagflag(m2)
[1] TRUE
于 2009-07-25T02:47:38.783 に答える