解决具有大矩阵的稀疏线性系统时发生写访问冲突

时间:2019-04-30 14:55:30

标签: c++ memory eigen3

晚上好, 我编写了一个程序,使用Eigen3来解决稀疏线性系统,其中输入矩阵是.mtx格式的SPD矩阵,而输出x应该是1的向量。 我必须测试9个不同的矩阵,该程序可以与前7个矩阵一起正常工作,而第8个矩阵会导致“写访问冲突”异常。 前7个矩阵的大小均小于100MB,而这大约是300MB。

这是代码:


typedef Eigen::SimplicialLDLT<SM> CS;
typedef Eigen::VectorXd V; 
typedef Eigen::SparseMatrix<double> SM;

int
main (int argc, char *argv[])
{
    SM mat;
    Eigen::loadMarket(mat, std::string(argv[1]));
    SM A = mat.selfadjointView<Eigen::Lower>();
    CS solver;
    V b(A.rows(), 1), x(A.rows(), 1), xe(A.rows(), 1);
    xe.setOnes(A.cols(), 1);

    b = A * xe;

    solver.compute(A); 
    x = solver.solve(b);
}

崩溃发生在Solver.compute(A)上。 调试代码后,我发现该错误位于SimplicialCholesky_impl.h内

Li[p] = k;                          /* store L(k,i) in column form of L */

Li的定义如下:

 StorageIndex* Li = m_matrix.innerIndexPtr();

但是Li的值是0x0000000000000000,我想这是不对的,但是我真的不知道该怎么做才能解决问题,尤其是因为这种情况只在特定的矩阵上发生。

感兴趣的矩阵是这个https://www.cise.ufl.edu/research/sparse/matrices/Janna/StocF-1465.html

我正在使用msvc和Visual Studio 2017,该版本是x64版本。

1 个答案:

答案 0 :(得分:1)

默认情况下,SparseMatrix使用int来存储索引,因此SimplicialLDLT<SM>的{​​{1}}因数也是如此。对于您的问题,您显然需要L,因此您所要做的就是:

long int

但这会花费一些时间,因为非超节点的Cholesky分解仅适用于2D问题,并且此矩阵来自3D有限元离散化。