我试图使用奇异值分解来计算R中大型稀疏矩阵的伪逆。矩阵L大约是240,000 x 240,000,我将它存储为dgCMatrix类型。 $ L $表示大直径图的拉普拉斯算子,我碰巧知道伪逆$ L ^ + $也应该是稀疏的。根据该图的较小子集的经验观察,L是〜.07%稀疏,而$ L ^ + $稀疏约2.5%。
我尝试过使用pinv,ginv和其他标准伪逆函数,但由于内存限制,它们会出错。然后我尝试选择包irlba提供的稀疏矩阵svd,然后在将所有输出转换为稀疏矩阵后,我将使用标准公式来计算伪逆。我的代码在这里:
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循环和向量乘法通过入口拼凑伪逆项,但我希望能够使用利用所得伪逆矩阵的稀疏性的简单函数来计算它。除了单独计算每一行之外,有没有办法使用L的SVD有效地计算$ L + $的伪逆?