m
R で大規模なスパース行列の最初の固有ベクトルを計算しようとしています。ここでeigen()
は N > 10 6を意味するため、使用は現実的ではありません。
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 を使用する関数のバグによるものと思われます。
バグを解決するための提案 (パッケージ コードを確認しようとしましたが、複雑すぎて理解できません)、または別の方法で固有ベクトルを計算するための提案を歓迎します。