我是堆叠溢出的新手,所以第一次发布一个问题。 我的目标是利用共轭梯度技术和不完全的cholesky预处理器,利用特征库来求解线性方程Ax = b。所以我基本上看的是ICCG算法。据我所知,本征库允许将预处理器集成到共轭梯度求解器中。我有一个简单的虚拟代码,无法执行。
#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是我上面指定的特征库的路径。
答案 0 :(得分:2)
IncompleteCholesky
是一个包含3个模板参数的模板类。最后两个是选项,但您需要指定第一个,即标量类型:
typedef ConjugateGradient<SparseMatrix<double>,Lower, IncompleteCholesky<double> > ICCG;