Сопряженный градиент с неполным предварительным условием cholesky возвращает неожиданные ошибки для библиотеки Eigen

Я новичок в переполнении стека, поэтому отправляю вопрос впервые.
Я стремлюсь решить линейное уравнение Ax = b, используя метод сопряженных градиентов с неполным предварительным условием Холески, используя библиотеку Эйгена. Так что я в основном смотрю на алгоритм ICCG. Библиотека Eigen, как я понимаю, позволяет интегрировать предобработчик в сопряженный градиентный решатель. У меня есть простой фиктивный код, который не выполняется.

#include <iostream>
#include <Eigen>
using namespace std;
int main()
{
int n = 10;
SparseMatrix<double> A = MatrixXd::Random(n,n).sparseView(0.5,1);
VectorXd b(n),x(n);
/* Eigen::ConjugateGradient<SparseMatrix<double>, Eigen::Lower|Eigen::Upper, IdentityPreconditioner> cg;  */
Eigen::ConjugateGradient<SparseMatrix<double>, Eigen::Lower, IncompleteCholesky> cg;
cg.compute(A);
x = cg.solve(b);
x = cg.solve(b);
return 0;
}

При компиляции с g ++ с максимальной оптимизацией (-O3) выдается следующая ошибка:

../PracTemplates.cpp:62:94: error: type/value mismatch at argument 3 in template parameter list for 'template<class _MatrixType, int _UpLo, class _Preconditioner> class Eigen::ConjugateGradient'

Я также получаю ошибки, связанные с .compute () и .solve (), но я полагаю, что они связаны с проблемой с вышеупомянутой ошибкой.

Однако метод сопряженных градиентов работает с Identity Preconditioner.

Судя по ошибке, я явно что-то упускаю из объявления объекта. Любая помощь будет оценена. Благодарю.

PS: я использую Eclipse IDE, поэтому все, что я сделал, это включил путь к моей собственной библиотеке «D: \ C ++ Development \ Eigen» во вкладке «Пути и символы».

Команды компиляции:

g++ -I$PATH -O3 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"PracTemplates.d" -MT"PracTemplates.o" -o "PracTemplates.o" "../PracTemplates.cpp"

где «PracTemplates.cpp — это имя моего файла, а $ PATH — мой путь к собственной библиотеке, как указано выше.

0

Решение

IncompleteCholesky класс шаблона с 3 параметрами шаблона. Последние два являются необязательными, но вам нужно указать первый, который является скалярным типом:

typedef ConjugateGradient<SparseMatrix<double>,Lower, IncompleteCholesky<double> > ICCG;
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector