gpt4 book ai didi

c++ - 求解具有大矩阵的稀疏线性系统时的写访问冲突

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:03:04 24 4
gpt4 key购买 nike

晚上好我编写了一个程序,它使用 Eigen3 来求解稀疏线性系统,其中输入矩阵是 .mtx 格式的 SPD 矩阵,输出 x 应该是一个 vector 。我必须测试 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 的值是 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

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

我正在使用 msvc 和 visual studio 2017,构建版本为 x64。

最佳答案

默认 SparseMatrix使用 int存储索引,因此也是 SimplicialLDLT<SM>为其L因素。对于您的问题,您显然需要 long int , 所以你所要做的就是:

typedef Eigen::SparseMatrix<double,ColMajor,long> SM; 

但这需要时间,因为非超节点 Cholesky 分解仅适用于 2D 问题,而该矩阵来自 3D 有限元离散化。

关于c++ - 求解具有大矩阵的稀疏线性系统时的写访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55923629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com