Добрый вечер,
Я написал программу, которая использует Eigen3 для решения разреженной линейной системы, где входная матрица является SPD-матрицей в формате .mtx, а выходной x должен быть вектором единиц.
Мне нужно протестировать 9 разных матриц, программа отлично работает с первыми 7 матрицами, а 8-я вызывает исключение «нарушение прав доступа при записи».
Все первые 7 матриц имеют размер <100 МБ, а эта - около 300 МБ. </p>
Это код:
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.