我正在尝试在 Android 应用程序上使用 Levenberg Marquardt 算法的 Eigen 实现。为了使用 Eigen,我使用的是 Android NDK 和 jni。我已经用简单的计算(如矩阵创建和向量和)测试了 Eigen,它工作得很好。但是,当我尝试使用 Levenberg Marquardt 算法时,我在 Eigen 库中的 LevenbergMarquardt.h 文件中遇到了一些错误。
首先,这是我的代码。我基于这段代码:
Eigen::MatrixXd matrix(count, 3);
for (int i = 0; i < count; i++) {
Eigen::VectorXd t(3);
t << x[i], y[i], accuracy[i];
matrix.row(i) = t;
}
distance_functor functor(matrix, count);
Eigen::NumericalDiff<distance_functor> numDiff(functor);
Eigen::LevenbergMarquardt<Eigen::NumericalDiff<distance_functor>,double> lm(numDiff);
lm.parameters.maxfev = 2000;
lm.parameters.xtol = 1.49012e-08;
lm.parameters.ftol = 1.49012e-08;
lm.parameters.gtol = 0;
lm.parameters.epsfcn = 0;
Eigen::LevenbergMarquardtSpace::Status ret = lm.minimize(poseResult);
这些是我得到的错误。前两个错误在 Eigen 的库中,最后一个错误在 LevenbergMarquardt 对象创建中。在消息之后,我还包含了相应的错误代码行:
无效的模板参数 LevenbergMarquardt.h /jnimath/jni/unsupported/Eigen/src/LevenbergMarquardt line 121 语义错误
typedef PermutationMatrix<Dynamic,Dynamic> PermutationType;
无效的模板参数 LevenbergMarquardt.h /jnimath/jni/unsupported/Eigen/src/NonLinearOptimization 第 103 行语义错误
PermutationMatrix<Dynamic,Dynamic> permutation;
无效的模板参数 test.cpp /jnimath/jni 第 47 行语义错误
特征::LevenbergMarquardt,double> lm(numDiff);
前两个错误真的很奇怪,因为还有一些其他类型定义使用 Dynamic 并且它们没有抛出错误。
另外,我注意到我在编译时遇到了一些符号错误,它们是:
符号 'YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY' 无法解析 Matrix.h /jnimath/jni/Eigen/src/Core 第 277 行语义错误
符号 'YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX' 无法解析 Matrix.h /jnimath/jni/Eigen/src/Core line 224 语义错误
所以,我有两个问题:
为什么我在这些行上出现错误?
有谁知道如何解决这个问题?
谢谢