【发布时间】:2013-06-06 15:56:44
【问题描述】:
我正在尝试计算 R 中大型稀疏矩阵的 m 第一个特征向量。使用 eigen() 是不现实的,因为这里大意味着 N > 106。
到目前为止,我发现我应该使用 igraph 包中的 ARPACK,它可以处理稀疏矩阵。但是我不能让它在一个非常简单的(3x3)矩阵上工作:
library(Matrix)
library(igraph)
TestDiag <- Diagonal(3, 3:1)
TestMatrix <- t(sparseMatrix(i = c(1, 1, 2, 2, 3), j = c(1, 2, 1, 2, 3), x = c(3/5, 4/5, -4/5, 3/5, 1)))
TestMultipliedMatrix <- t(TestMatrix) %*% TestDiag %*% TestMatrix
然后使用arpack()函数的帮助示例中给出的代码提取前2个特征向量:
func <- function(x, extra=NULL) { as.vector(TestMultipliedMatrix %*% x) }
arpack(func, options=list(n = 3, nev = 2, ncv = 3, sym=TRUE, which="LM", maxiter=200), complex = FALSE)
我收到一条错误消息:
Error in arpack(func, options = list(n = 3, nev = 2, ncv = 3, sym = TRUE, :
At arpack.c:1156 : ARPACK error, NCV must be greater than NEV and less than or equal to N
我不明白这个错误,因为这里 ncv (3) 大于 nev (2),并且等于 N (3)。
我犯了一些愚蠢的错误还是有更好的方法来计算 R 中稀疏矩阵的特征向量?
更新
此错误显然是由于 arpack() 函数中的错误导致的,其中包含大写/小写 NCV 和 NEV。
欢迎任何解决错误的建议(我试图查看包代码,但它太复杂,我无法理解)或以其他方式计算特征向量。
【问题讨论】:
-
这可能是
arpack()函数的一个bug。 -
如果不是函数本身的错误,至少应该更新文档以反映这一事实,因为 nev 和 ncv 总是小写的。
-
不幸的是,这不是真的,我的意思是小写/大写的东西。如果您以大写形式给出它们,那么它们将被简单地忽略,并且将 nev 设置为 1,将 ncv 设置为 3。
-
这解释了我的following question。
标签: r sparse-matrix igraph eigenvector arpack