2009-07-25 69 views
6

我有一个矩阵,我想知道这是否是对角化对角化。我如何在R编程语言中执行此操作?确定是否矩阵是在R编程语言

+0

plesae问你的问题在相关数学论坛... – 2009-07-25 02:34:35

+0

这是确定的,他们的预期。 http://blog.stackoverflow.com/2009/07/stack-overflow-flash-mobs/ – LachlanG 2009-07-25 02:38:03

+7

@Mitch:这是一个编程问题。 R是一种编程语言。 – jalf 2009-07-25 02:50:25

回答

7

如果你有一个给定的矩阵,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%%解决(P)]应该是相同的为m

是的,我完全偷从R Wiki

4

可以实现完整的算法来检查矩阵减少到约旦的形式或对角线之一(见例如,this document)。或者你可以采取快速和肮脏的方式:对于n维方阵,使用特征(M)$值并检查它们是不同的值。对于随机矩阵,这总是足够的:简并性有prob0。

P.S:基于由JD长一个简单的观察之下,我忆及,diagonalizability一个充分必要条件是,特征向量跨越原有的空间。要检查这一点,只要看到特征向量矩阵具有满秩(无零特征值)。因此,这里是代码:

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 
2

你可能想一些基本的讨论和代码检查this page。您需要搜索“对角化”,这是相关部分开始的地方。