我想求解类似系统A^t * A * x = -A^t * x
的最小二乘。(我正在为特殊问题执行高斯-牛顿方法(。
我编写了一些特殊的例程,允许我计算A * x
和A^t * y
的乘积。有了这样的例程,由于Eigen,可以很容易地使用无矩阵求解器。
但我的方法收敛性不如Eigen::LeastSquaresConjugateGradient
。我做了一个小测试,看起来LeastSquareDiagonalPreconditioner
大大加快了收敛速度。
我的问题是——如果我只能计算矩阵乘积,我如何使用LeastSquareDiagonalPreconditioner
或实现自己的预处理器?顺便说一句,我不太了解预处理/共轭梯度的东西。
编辑
为了清晰起见,我想在我的产品例程中使用Eigen的无矩阵解算器。
编辑2
利用正向和反向模autodiff对一些目标函数求出矩阵向量积。
最简单的方法可能是实现您自己的预处理程序类,继承DiagonalPreconditioner
并实现类似LeastSquareDiagonalPreconditioner ::factorize()
但适合您的类型。基本上你需要计算:
m_invdiag(j) = 1./mat.col(j).squaredNorm();
对于所有列j
,使用您已经为产品运营商实现的策略。