这个问题是从交叉验证转移的:https ://stats.stackexchange.com/questions/274042/pseudoinverse-of-large-sparse-matrix-in-r
我正在尝试使用奇异值分解来计算 R 中大型稀疏矩阵的伪逆。矩阵大约为 240,000 x 240,000,我将其存储为 type dgCMatrix。我曾尝试使用pinv、ginv和其他标准伪逆函数,但由于内存限制,它们会出错。然后我尝试选择包提供的稀疏矩阵 svd irlba,然后在将所有输出转换为稀疏矩阵后,我将使用标准公式计算伪逆。我的代码在这里:
lim = 40
digits = 4
SVD =irlba(L,lim)
tU = round(SVD$u,digits)
nonZeroU = which(abs(U)>0,arr.ind = T)
sparseU = sparseMatrix(i=nonZeroU[,2],j=nonZeroU[,1],x = U[nonZeroU])
V = round(SVD$v,digits)
nonZeroV = which(abs(V)>0,arr.ind = T)
sparseV = sparseMatrix(i=nonZeroV[,1],j=nonZeroV[,2],x = U[nonZeroV])
D = as(Diagonal(x=1/SVD$d),"sparseMatrx")
pL =D%*%sparseU
pL = sparseV%*%pL
我能够毫无问题地到达最后一行,但是由于内存限制,我收到一个错误,上面写着
Error in sparseV %*% pL :
Cholmod error 'problem too large' at file ../Core/cholmod_dense.c, line 105
当然,我可以使用 for 循环和向量乘法将伪逆条目拼凑起来,但我希望能够使用一个简单的函数来计算它,该函数利用生成的伪逆矩阵的稀疏性。由于原始矩阵的性质(它是一个图拉普拉斯算子),我知道伪逆也应该是一个稀疏矩阵。任何帮助将不胜感激!