我可以将 Eigen Levenberg Marquardt 与线性方程和常量雅可比行列式一起使用吗?
Can I use Eigen Levenberg Marquardt with linear equations and constant Jacobian?
问题:我正在尝试使用本征不受支持的 levenberg marquardt 来寻找两个线性方程的最佳参数。当我 运行 我的代码时,算法会很快收敛到不正确的答案。
预期:我使用参数 tFx =13.7、tFy = 13.5、tCx = 0.0、tCy = 生成了一堆项 tU、tX、tZ、tY 和 tV 0.0。我希望 LM return 与用于生成 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;
我的参数向量是:
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);
我省略了所有初始化废话,这样问题就清楚了。我真的很感激任何帮助,因为此代码不受支持。对这个问题的任何回答只会帮助其他人更好地理解本征不受支持的功能。
我的方程是正确的。如果其他人有这个问题,我建议只提出一个测试用例。例如,在我的代码中,我只是将方程式简化为
aH(i) = tFx- tCx;
aH(i + mObjectPoints.size()) = tFy - tCy;
然后雅可比变为
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 将参数最小化到正确的值。取决于您将它们初始化为什么。
问题:我正在尝试使用本征不受支持的 levenberg marquardt 来寻找两个线性方程的最佳参数。当我 运行 我的代码时,算法会很快收敛到不正确的答案。
预期:我使用参数 tFx =13.7、tFy = 13.5、tCx = 0.0、tCy = 生成了一堆项 tU、tX、tZ、tY 和 tV 0.0。我希望 LM return 与用于生成 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;
我的参数向量是:
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);
我省略了所有初始化废话,这样问题就清楚了。我真的很感激任何帮助,因为此代码不受支持。对这个问题的任何回答只会帮助其他人更好地理解本征不受支持的功能。
我的方程是正确的。如果其他人有这个问题,我建议只提出一个测试用例。例如,在我的代码中,我只是将方程式简化为
aH(i) = tFx- tCx;
aH(i + mObjectPoints.size()) = tFy - tCy;
然后雅可比变为
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 将参数最小化到正确的值。取决于您将它们初始化为什么。