本征:如果我只能计算 Aty 和 Ax,是否有可能创建类似 LeastSquareDiagonalPreconditioner 的调节器?

Eigen: Is it possible to create LeastSquareDiagonalPreconditioner-like conditioner if i only can compute Aty and Ax?

我想求解像系统 A^t * A * x = -A^t * x 这样的最小二乘法。 (我正在为特殊问题实施高斯-牛顿法)。

我编写了特殊的例程来计算 A * xA^t * y 乘积。有了这样的例程,由于 Eigen,可以很容易地使用无矩阵求解器。

但是我的方法收敛不如Eigen::LeastSquaresConjugateGradient。我做了一个小测试,看起来 LeastSquareDiagonalPreconditioner 加快了收敛速度。

我的问题是 - 如果我只能计算矩阵乘积,我如何使用 LeastSquareDiagonalPreconditioner 或实现自己的预调节器? 顺便说一句,我不太了解 preconditioning/conjugate 渐变的东西。

编辑

为清楚起见 - 我想在我的产品例程中使用 Eigen 的无矩阵求解器。

编辑 2

矩阵向量乘积是通过对某些 objective 函数使用正向和反向模式自动微分获得的。

最简单的方法可能是实现您自己的预调节器 class 继承 DiagonalPreconditioner 并实现类似于 LeastSquareDiagonalPreconditioner ::factorize() 但适应您的类型的东西。基本上你需要计算:

 m_invdiag(j) = 1./mat.col(j).squaredNorm();

对于所有列 j 使用您已经为产品运营商实施的策略。