我想写一个像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
的值。有什么办法吗?
答案 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)))