【发布时间】:2022-01-10 21:15:45
【问题描述】:
按照这个post,更具体地说是这个answer,我正在尝试在R 中从头开始构建一个eigen() 函数来计算特征值和特征向量。但是,我偶然发现了重复特征值的问题,而上述解决方案对此不起作用。
有没有一种简单而聪明的方法来解决这个问题?我知道它来自solveroot() 函数,因为在重复特征值的情况下,它不会改变符号。我想不出什么是特征值以及重复多少次的解决方法。
这是我目前拥有的。
# a matrix with two pairs of repeated eigenvalues
mat <- matrix(c( 1, .5, 0, 0,
.5, 1, 0, 0,
0, 0, 1, .5,
0, 0, .5, 1), 4, 4)
svd(mat)
# compute the determinant
eig <- function(lambda, mat) {
y <- mat - diag(lambda, nrow(mat))
return(det(y))
}
# A function to find potential 0 with uniroot
solveroot <- function(f, lower, upper, n = 100, tol = .Machine$double.eps^.5, ...){
xseq <- seq(lower, upper, length = n + 1)
mod <- sapply(X = xseq, FUN = f, ...)
Equi <- xseq[which(mod == 0)] # if any already = 0
ss <- mod[1:n] * mod[2:(n+1)] # check sign
ii <- which(ss < 0)
for (i in ii){
Equi <- c(Equi, uniroot(f = f,
lower = xseq[i],
upper = xseq[i + 1],
tol = tol,
...)$root)
}
return(Equi)
}
# find the eigenvalues
solveroot(f = eig, lower = 0.0001, upper = sum(diag(mat)), mat = mat)
# no eigenvalues are returned.
此代码适用于没有重复特征值的矩阵。
谢谢,
【问题讨论】:
标签: r eigenvalue eigenvector