我如何将ceres :: CubicInterpolator与不在统一网格上的数据一起使用

时间:2019-06-27 11:20:25

标签: c++ eigen ceres-solver

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值进行什么映射才能得出正确的答案?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

CubicInterpolator无法处理非均匀分布的数据。您必须自己使用三次样条曲线之类的方法。