晚上好, 我编写了一个程序,使用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版本。
答案 0 :(得分:1)
默认情况下,SparseMatrix
使用int
来存储索引,因此SimplicialLDLT<SM>
的{{1}}因数也是如此。对于您的问题,您显然需要L
,因此您所要做的就是:
long int
但这会花费一些时间,因为非超节点的Cholesky分解仅适用于2D问题,并且此矩阵来自3D有限元离散化。