优化问题通常涉及以值表形式给出的函数,例如一幅图像。计算这些函数以及他们的导数需要对这些值进行插值。插值表格函数是一个广泛的研究领域,有许多库已经实现了一些插值问题。然而,在cere的自动求导框架中去是很困难的。为此,ceres提供了对一维和两维的表格函数的插值能力。
一维的插值是基于Cubic Hermite Spline,也称为Catmull-Rom Spline。这生成一阶差分插值函数。二维插值格式是一维插值格式的推广,在两维中一维的插值函数是分开的。
更多细节参考:More details of the construction can be found Linear Methods for Image Interpolation by Pascal Getreuer.
class CubicInterpolator
给定一个无限的一维网格作为输入,其提供了以下接口:
struct Grid1D { enum { DATA_DIMENSION = 2; }; void GetValue(int n, double* f) const; };
函数GetValue给出了一个函数f(可能是向量值)的值,在给定任意的n和用于指示被插函数的维度DATA_DIMENSION。例如:如果打算以角轴的格式插值旋转,那么DATA_DIMENSION=3。
CubicInterpolator
使用Cubic Hermite splines来生成一个平滑的近似于它的值,其可以用来估计f(x)以及f'(x)在任何的实数线上的点。例如,以下代码对四个元素的数组进行插值。
const double x[] = {1.0, 2.0, 5.0, 6.0}; Grid1D<double, 1> array(x, 0, 4); CubicInterpolator interpolator(array); double f, dfdx; interpolator.Evaluate(1.5, &f, &dfdx);
以上代码使用Grid1D模板类来与c++数组和CubicInterpolator相交互。
Grid1D支持向量值函数其中函数的各种坐标可以交错或堆叠。它还允许使用任何数字类型作为输入,只要它可以安全地转换为double。
class BiCubicInterpolator
给定一个无线二维网格作为输入,该网格提供以下接口:
struct Grid2D { enum {DATA_DIMENSION = 2}; void GetValue(int row, int col, double* f) const; }
GetValue函数给出函数f(可能是向量值)在任何整数对row和col下的值;DATA_DIMENSION指出被插值函数的维数。例如,如果想对一副彩色图有三个通道进行插值,那么DATA_DIMENSION=3。
BiCubicInterpolator使用三次卷积插值算法R.keys来生成一个平滑的近似值,可以用来计算在实平面中任一点的
例如以下代码对一个二维数组进行插值:
const double data[] = {1.0, 3.0, -1.0, 4.0, 3.6, 2.1, 4.2, 2.0, 2.0, 1.0, 3.1, 5.2}; Grid2D<double, 1> array(data, 0, 3, 0, 4); BiCubicInterpolator interpolator(array); double f, dfdr, dfdc; interpolator.Evaluate(1.2, 2.5, &f, &dfdr, &dfdc);
以上代码,模板类Grid2D用于让c++数据像一个两维的表对于BiCubicInterpolator来说。
Grid2D支持行或列优先的布局。它支持向量值函数,其中,函数的各个坐标可以交错或堆叠。它还允许使用任何数字类型作为输入,只要它可以安全地转换为double。
标签:const,函数,插值,double,三次,DATA,DIMENSION From: https://www.cnblogs.com/gary-guo/p/16617120.html