R中大型稀疏矩阵的特征值

R中大型稀疏矩阵的特征值,r,matrix,out-of-memory,sparse-matrix,R,Matrix,Out Of Memory,Sparse Matrix,我有一些大的(对称实)稀疏矩阵,我想计算一些最大和最小的(数量级)特征值。我查看了犰狳,但它链接到了用Fortran编写的ARPACK库。作为一个Widnows用户,我手头没有Fortran编译器,所以我决定使用ARPACK R包,它是为Windows预编译的 我的矩阵是以MatrixMarket格式存储的,在R中,我阅读它如下: 库(矩阵) f在使用rARPACK软件包后,很明显问题不在于矩阵转换为稠密,而在于LU分解必须显著改变稀疏矩阵的顺序,以避免数值问题,从而极大地填充矩阵 新版本的软件

我有一些大的(对称实)稀疏矩阵,我想计算一些最大和最小的(数量级)特征值。我查看了犰狳,但它链接到了用Fortran编写的ARPACK库。作为一个Widnows用户,我手头没有Fortran编译器,所以我决定使用ARPACK R包,它是为Windows预编译的

我的矩阵是以MatrixMarket格式存储的,在R中,我阅读它如下:

库(矩阵)
f在使用rARPACK软件包后,很明显问题不在于矩阵转换为稠密,而在于LU分解必须显著改变稀疏矩阵的顺序,以避免数值问题,从而极大地填充矩阵

新版本的软件包将使用LDLT分解,它似乎不会遇到这个问题,并快速计算特征值

在新版本发布之前,您可以获取的副本并将其用于:

类CSS对称稀疏矩阵{
受保护的:
typedef Eigen::SparseMatrix SpMat;
typedef Eigen::SimplicialLDLT spltsolver;
常数大小;
SpMat m_mat;
SpLDLTSolver解算器;
公众:
CsSymmetricSparsematrix_InvProduct(常数cs*p_矩阵)
:m_mat(int(p_矩阵->m),int(p_矩阵->n)),n(p_矩阵->n)
{
//可以使用Eigen::internal::viewAsEigen(p_矩阵);
_资产(p_矩阵->m==p_矩阵->n);
//必须是正方形的
std::载体三联体;
保留(p_矩阵->p[p_矩阵->n]);
对于(尺寸i=0;ip[i],e=p\u矩阵->p[i+1];px[p];
大小n行=p矩阵->i[p],n列=i;
三元组。推回(本征::三元组(int(n_行),int(n_列),f_val));
}
}
//将CSparse矩阵展开为三元组
m_mat.setFromTriplets(triplets.begin(),triplets.end());
//填充特征矩阵
m_mat.makeCompressed();
//压缩特征矩阵
}
大小\u t行()常量
{
返回n;
}
大小\u t cols()常数
{
返回n;
}
无效集移位(双西格玛)
{
SpMat I((int)n,(int)n);
I.setIdentity();
solver.compute(m_mat-I*sigma);//最好使用solver.setShift(-sigma,1.0);
/*size_t n_fac_nnz=((SpMat)solver.matrixL()).nonZeros();//输入cast required,否则它将永远循环
fprintf(stderr,“debug:LDLT因式分解具有“PRIsize”非零\n”,n_fac_nnz)*/
}
//y_out=inv(A-西格玛*I)*x_in
无效执行操作(常数加倍*x\u输入,加倍*y\u输出)常数
{
本征::映射x(x_in,n);
本征::映射y(y_out,n);
y、 noalias()=solver.solve(x);
}
私人:
csSymmetricSparsematrix_InvProduct(const csSymmetricSparsematrix_InvProduct&r_other);//无副本
csSymmetricSparseMatrix_InvProduct&operator=(const csSymmetricSparseMatrix_InvProduct&r_other);//无副本
};

我可能错了,但如果没有数据,或者至少是一个最小的、可重复的例子,可能很难回答。@Pascal,你可能是对的。我已经链接了数据和脚本。上传可能需要一段时间……我只能跟踪R端发生的事情,而这不是特征值计算发生的地方。R本质上是执行计算的C++/fortran代码的前端。阅读源代码可以获得更多的洞察力@谢谢你,这实际上是一个非常简单的C++实现,这就是我在开始之前看到的,如果时间允许的话,当然要给R. Will一个机会。从第一眼看,似乎在反转和移位模式中使用了密集的LDLT分解,这将导致解算器很容易耗尽内存。