确定矩阵在R编程语言中是否可对角化

med*_*oll 7 r matrix

我有一个矩阵,我想知道它是否可以对角化.我如何用R编程语言执行此操作?

JD *_*ong 7

如果你有一个给定的矩阵m,则一种方法是将特征向量乘以特征值的对角线乘以原始矩阵的逆.这应该让我们回到原始矩阵.在R看起来像:

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

所以在那个例子中p %*% d %*% solve(p)应该是相同的m


gap*_*ppy 5

您可以实现完整的算法来检查矩阵是否简化为乔丹形式或对角形式(例如,参见本文档)。或者您可以采取快速而肮脏的方法:对于 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
Run Code Online (Sandbox Code Playgroud)