Ceres解算器允许使用分段三次Hermite插值进行插值,我正尝试使用该插值为Eigen创建三次插值。
This snippet from ceres/examples
显示了如何设置插值器。对其进行修改以为我的用例提供一个玩具示例:
const int kNumSamples = 4;
double x[kNumSamples];
x[0] = 12.5; x[1] = 13.9; x[2] = 14.0; x[3] = 21.4;
double values[kNumSamples];
for (int i = 0; i < kNumSamples; ++i) {
values[i] = (x[i] - 4.5) * (x[i]- 4.5);
}
Grid1D<double> array(values, 0, kNumSamples);
CubicInterpolator<Grid1D<double> > interpolator(array);
我相信可以在给定数据点之间的某个位置进行评估,例如:
double x_interp = 1.5;
double y_interp;
double dydx_interp;
double yi = interpolator_.Evaluate(x_interp, &y_interp, &dydx_interp);
但是Grid1D对象不知道x值是什么。它始终假定数据在常规网格上,从某个索引(在这种情况下为0)开始,并包含kNumSamples
(在这种情况下为4)样本。
问题
如何使Grid1D
知道实际的输入x位置?或者,我应该对我的x_interp
值进行什么映射才能得出正确的答案?
感谢您的帮助!
答案 0 :(得分:1)
CubicInterpolator无法处理非均匀分布的数据。您必须自己使用三次样条曲线之类的方法。