Нарушение прав записи при решении разреженной линейной системы с большой матрицей - PullRequest
2 голосов
/ 30 апреля 2019

Добрый вечер, Я написал программу, которая использует 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.

1 Ответ

1 голос
/ 02 мая 2019

По умолчанию SparseMatrix использует int для хранения индексов и, следовательно, SimplicialLDLT<SM> для его коэффициента L.Для вашей задачи вам явно требуется long int, поэтому все, что вам нужно сделать, это:

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

, но это займет время, потому что несверхнодальная факторизация Холецкого хороша только для двумерных задач, и эта матрица получается изтрехмерная дискретизация конечных элементов.

...