如果你有一个给定的矩阵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
您可以实现完整的算法来检查矩阵是否简化为乔丹形式或对角形式(例如,参见本文档)。或者您可以采取快速而肮脏的方法:对于 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)
| 归档时间: |
|
| 查看次数: |
6608 次 |
| 最近记录: |