Я новичок в переполнении стека, поэтому отправляю вопрос впервые.
Я стремлюсь решить линейное уравнение 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 — мой путь к собственной библиотеке, как указано выше.
IncompleteCholesky
класс шаблона с 3 параметрами шаблона. Последние два являются необязательными, но вам нужно указать первый, который является скалярным типом:
typedef ConjugateGradient<SparseMatrix<double>,Lower, IncompleteCholesky<double> > ICCG;
Других решений пока нет …