我有一个矩阵,想知道它是否可对角化。如何在R编程语言中实现?
我有一个矩阵,想知道它是否可对角化。如何在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
相同。
P.S.:基于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
所有沿对角线对称的矩阵都可以被正交矩阵对角化。实际上,如果你想要仅通过正交矩阵共轭来对角化,即 D= P AP',其中P'表示转置,则沿对角线的对称性,即A_{ij}=A_{ji},与对角化完全等价。
如果矩阵不对称,则对角化意味着不是D=PAP',而只是D=PAP^{-1},我们不一定有P'=P^{-1},这是正交性的条件。
你需要做更实质性的事情,并且可能有更好的方法,但你可以计算特征向量并检查秩是否等于总维度。
请参见this discussion以获取更详细的解释。