这与此question有关。我今天对共轭渐变进行了一些实验,特别是我尝试了max_iterations
和tolerance
。它更快但不够快。根据文档,在编译中添加-fopenmp
以启用multi-threading
就足够了。
我已使用两者进行了测试
`omp_set_num_threads(nbrThreads);
Eigen::setNbThreads(nbrThreads);`
如果我使用5个线程或1个线程,时间没有区别,我觉得有点奇怪。
其次,使用pre-conditoning
加速解决方案的另一种方法。当我尝试做的时候:
Eigen::ConjugateGradient<Eigen::SparseMatrix<float>, Eigen::Lower, Eigen::IncompleteCholesky<float>> cg;
我收到错误:
void Eigen::IncompleteCholesky<Scalar, _UpLo, _OrderingType>::_solve_impl(const Rhs&, Dest&) const [with Rhs = Eigen::Matr
ix<float, -1, 1>; Dest = Eigen::Matrix<float, -1, 1>; Scalar = float; int _UpLo = 1; _OrderingType = Eigen::AMDOrdering<int>]: Assertion `m_factorizationIsOk && "factorize() should be called first"' failed.
鉴于Eigen::SimplicialLDLT
的作用是Cholesky分解,那么不完整也应该有用吗?
编辑: 以下是我如何调用cg:
Eigen::ConjugateGradient<Eigen::SparseMatrix<float>, Eigen::Lower, Eigen::IncompleteCholesky<float>> cg;
cg.setTolerance(0.01);
cg.setMaxIterations(50);
cg.analyzePattern(A_tot);
cg.compute(A_tot);
Eigen::VectorXf opt = cg.solveWithGuess(b_tot, rho_current);
实际上当您阅读有关IterativeSolvers here的内容时,则未列出IncompleteCholesky
。虽然IncompleCholesky被定义为here。
答案 0 :(得分:1)
如文档中所述,您需要存储完整矩阵(上下三角形部分),并将Lower|Upper
传递给ConjugateGradient
以使用cg进行多线程处理。
答案 1 :(得分:0)
问题似乎是我安装了一个beta版本的Eigen。它使用Eigen 3.3.2