Как я могу использовать ceres :: CubicInterpolator с данными не на единой сетке - PullRequest
0 голосов
/ 27 июня 2019

Решатель 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 значениями, чтобы получить правильный ответ?

Спасибо за любую помощь!

...