Решатель Ceres позволяет выполнять интерполяцию с кусочно-кубическим интерполяцией Эрмита, которую я пытаюсь использовать для создания кубического интерполанта для Eigen.
Этот фрагмент из 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
значениями, чтобы получить правильный ответ?
Спасибо за любую помощь!