用于计算R中矩阵的特征值的函数

时间:2013-04-21 14:09:08

标签: r eigenvector eigenvalue linear-equation

我想写一个像eigen()这样的函数来计算任意矩阵的特征值和特征向量。我写了以下代码来计算特征值,我需要一个函数或方法来求解得到的线性方程。

eig <- function(x){
       if(nrow(x)!=ncol(x)) stop("dimension error")
          ff <- function(lambda){
                for(i in 1:nrow(x)) x[i,i] <- x[i,i] - lambda
                }
det(x)
}

我需要求解det(x)=0这是一个多项式线性方程,以找到lambda的值。有什么办法吗?

2 个答案:

答案 0 :(得分:3)

以下是使用uniroot.all的一种解决方案:

library(rootSolve)
myeig <- function(mat){
  myeig1 <- function(lambda) {
    y = mat
    diag(y) = diag(mat) - lambda
    return(det(y))
  }

  myeig2 <- function(lambda){
    sapply(lambda, myeig1)
  }
  uniroot.all(myeig2, c(-10, 10))
}

R > x <- matrix(rnorm(9), 3)
R > eigen(x)$values
[1] -1.77461906 -1.21589769 -0.01010515
R > myeig(x)
[1] -1.77462211 -1.21589767 -0.01009019

答案 1 :(得分:1)

计算行列式是一个不好的主意,因为它在数值上不稳定。即使对于中等大小的矩阵,也可以轻松获得Inf等。我建议阅读以下答案(否则请阅读,否则您不知道我的代码在做什么):

然后使用以下任意一个

NullSpace(A - diag(lambda, nrow(A)))
nullspace(A - diag(lambda, nrow(A)))