我有一个矩阵,我想知道它是否可以对角化。我如何在 R 编程语言中做到这一点?
4 回答
如果您有一个给定的矩阵 m,那么一种方法是将特征向量乘以特征值的对角线乘以原始矩阵的逆矩阵。这应该让我们回到原始矩阵。在 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
您可以实现完整的算法来检查矩阵是否简化为 Jordan 形式或对角线形式(例如,参见本文档)。或者您可以采取快速而肮脏的方法:对于 n 维方阵,使用 eigen(M)$values 并检查它们是否是 n 个不同的值。对于随机矩阵,这总是足够的:退化有 prob.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
您可能想查看此页面以获取一些基本讨论和代码。您需要搜索相关部分开始的“对角化”。
对角线上的所有对称矩阵都可以通过正交矩阵对角化。事实上,如果你只想通过正交矩阵共轭来对角化,即 D= P A P' 其中 P' 代表转置,那么对角线上的对称性,即 A_{ij}=A_{ji},完全等同于对角化性。
如果矩阵不是对称的,那么对角化意味着不是 D= P A P' 而仅仅是 D=P A P^{-1} 并且我们不一定有 P'=P^{-1} 这是正交性的条件.
您需要做一些更实质性的事情,并且可能有更好的方法,但是您可以只计算特征向量并检查等级是否等于总维度。
有关更详细的说明,请参阅此讨论。