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

Я новичок в переполнении стека, поэтому задаю вопрос впервые. Я стремлюсь решить линейное уравнение Ax = b, используя метод сопряженного градиента с неполным предобуславливателем холецкого, используя библиотеку Eigen. Так что я в основном смотрю на алгоритм 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(), но я считаю, что они связаны с проблемой с вышеупомянутой ошибкой.

Однако метод сопряженного градиента работает с предобуславливателем идентичности.

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

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 — мой путь к собственной библиотеке, как указано выше.


person Ryan    schedule 12.03.2017    source источник
comment
Не могли бы вы добавить свой раздел #include и команду g++? Это облегчило бы нам воспроизведение ошибки.   -  person maij    schedule 12.03.2017
comment
Да да, конечно. Я внес изменения.   -  person Ryan    schedule 12.03.2017


Ответы (1)


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

typedef ConjugateGradient<SparseMatrix<double>,Lower, IncompleteCholesky<double> > ICCG;
person ggael    schedule 13.03.2017
comment
Так как же тогда будет выглядеть полный код? И будет ли прекондиционер IncompleteCholesky также работать с решателем LeastSquaresConjugateGradient? - person Tom Wenseleers; 12.09.2019