我可以将Eigen Levenberg Marquardt与线性方程和常数Jacobian一起使用吗?

时间:2018-01-04 18:13:01

标签: c++ eigen nonlinear-optimization levenberg-marquardt

问题:我正在尝试使用特征不支持的levenberg marquardt来找到两个线性方程的最优参数。当我运行我的代码时,算法很快收敛到错误的答案。

预期:我使用参数tFx = 13.7,tFy = 13.5,tCx = 0.0,tCy = 0.0生成了一组术语tU,tX,tZ,tY和tV。我希望LM返回与生成tU,tX,tZ,tY和tV相同的值。

观察:当我在方程上运行LM时,它产生tFx = 13.0,tFy = 13.0,tCx = 0.0,tCy = 0.0。

方法: 我试图找到以下两个方程的最佳参数集:

  aH(i) = tU - tFx*tX / tZ - tCx;
  aH(i + mObjectPoints.size()) = tV - tFy*tY / tZ - tCy;

我的parmeter矢量是:

double tFx = aP(0);
double tFy = aP(1);
double tCx = aP(2);
double tCy = aP(3);

和aH是我的函数向量。上面的等式产生一个不依赖于aP的常数雅可比行列式。

  aFjac(i, 0) = -1 * tX / tZ;
  aFjac(i, 1) = 0;
  aFjac(i, 2) = -1;
  aFjac(i, 3) = 0;
  aFjac(i + mObjectPoints.size(), 0) = 0;
  aFjac(i + mObjectPoints.size(), 1) = -1*tY/tZ;
  aFjac(i + mObjectPoints.size(), 2) = 0;
  aFjac(i + mObjectPoints.size(), 3) = -1;

我主要使用的是here显示的示例。在示例中,我使用的是运算符和df:

int operator()(const Eigen::VectorXd &aP,        //Input 
                     Eigen::VectorXd &aH) const  //Output 

int df(const InputType &aP, JacobianType& aFjac)

我检查的最小方法如下:

  Eigen::LevenbergMarquardt<CameraMatrixFunctor> lm(tFunctor);

  lm.parameters.factor = 0.001;
  lm.parameters.maxfev = 500;
  lm.parameters.xtol = 1e-5;



  lm.minimize(tP);

我遗漏了所有的初始化废话,所以问题很清楚。我非常感谢任何帮助,因为此代码不受支持。这个问题的任何答案只会帮助其他人更好地理解本征的不支持函数。

1 个答案:

答案 0 :(得分:0)

我的方程是正确的。如果其他人有这个问题,我建议你提出一个测试用例。例如,在我的代码中,我只是将方程式简化为

aH(i) = tFx- tCx;
aH(i + mObjectPoints.size()) = tFy - tCy;

然后jacobian成为

aFjac(i, 0) = 1;
aFjac(i, 1) = 0;
aFjac(i, 2) = -1;
aFjac(i, 3) = 0;
aFjac(i + mObjectPoints.size(), 0) = 0;
aFjac(i + mObjectPoints.size(), 1) = 1;
aFjac(i + mObjectPoints.size(), 2) = 0;
aFjac(i + mObjectPoints.size(), 3) = -1;

然后LM将参数最小化为正确的值。取决于你初始化它们的内容。