如何使用自定义预处理与Eigen
How to use custom preconditioner with Eigen
我正在尝试使用一个自定义预条件与Eigen的迭代求解器(例如CG)。具体来说,我必须多次解决类似的问题:矩阵略有变化,但保持接近平均矩阵。我想计算均值矩阵的Cholesky分解,然后将其用作预条件。
我的想法是这样的:
ConjugateGradient< SparseMatrix<double>, Lower, CholmodSupernodalLLT<SparseMatrix<double>> > solver(meanMatrix);
solver.preconditioner().compute(meanMatrix);
// Loop on n similar matrices
for(int i = 0; i < n; i++){
// create matrix: it is similar (in structure and in values) to meanMatrix
SparseMatrix<double> matrix = ...;
// create right-hand-side
VectorXd rhs = ...;
// update matrix reference for solver
solver.compute(matrix);
// solve using the preconditioned CG
solver.solve(rhs);
}
问题在于调用solver.compute(matrix)实际上会导致共轭梯度(实际上是IterativeSolverBase)在其前置条件上调用compute(参见IterativeSolverBase.h的1.111节,本章3.2.9节):
m_preconditioner.compute(*mp_matrix);
即基于均值矩阵的预条件被新矩阵的Cholesky分解所取代,因此CG解在1次迭代中收敛。相反,我想保持相同的预条件(平均矩阵的Cholesky分解,在循环之前一次性计算),并使用预条件CG求解不同的矩阵。
是否有一种简单的方法来实现我想做的事情?
提前感谢您的帮助!我希望这是有意义的。如果没有,请不要犹豫,让我澄清。
一种方法是围绕CholmodSupernodalLLT
编写一个小包装器,显示所需的预调节器API,其compute()
方法将是no-op。这可以从identitypreconditioning中获得灵感,在10-15行代码中完成。唯一需要更改的是存储CholmodSupernodalLLT
对象(或引用)并实现solve
以返回m_llt.solve(b);
。
相关文章:
- 错误:无效的预处理指令 #i 的意思是 #if?
- C++预处理会生成变量成员、资源库和映射
- 使用预处理指令检查是否包含标头?
- 预处理的 C/C++ 文件是否特定于计算机?
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 在 CPLEX 中求解线性规划,无需剪切和预处理
- CPP -D 选项,用于预处理 Fortran 代码
- 错误:粘贴"tmp_UINT"和"+"未提供有效的预处理令牌
- 任务计划程序库的预处理不起作用 - 多定义错误
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- 使用python预处理后,C++(opencv)中的垫子类型数据与image_to_array相同
- Howo 使用 cl 预处理为 masm 组装生成一个单独的文件
- 我有一个预处理的 C/C++ 源文件 (cacti.i).如何从这个 .i 文件生成可执行二进制文件,以便我可以像 ./
- 如何使用Visual Studio C/C++编译器(cl.exe)来预处理我的objective-C代码
- 是具有预处理前分支实现的结构违反ODR
- 与不完整的Cholesky预处理的共轭梯度返回特征库的意外错误
- Visual Studio C - 无法输出预处理文件
- 在海湾合作委员会中加快宏观预处理的任何方法
- Xmllint未设置,而在路径中找不到XMLLINT;跳过XML预处理
- 如何使用自定义预处理与Eigen