2016-07-14 10:10:13 -07:00
|
|
|
Sampled Functions
|
|
|
|
|
--
|
|
|
|
|
|
|
|
|
|
It is common to not have an analytical representation of the optimization
|
|
|
|
|
problem but rather a table of values at specific inputs. This commonly occurs
|
|
|
|
|
when working with images or when the functions in the problem are expensive to
|
|
|
|
|
evaluate. To use this data in an optimization problem we can use interpolation
|
|
|
|
|
to evaluate the function and derivatives at intermediate input values.
|
|
|
|
|
|
|
|
|
|
There are many libraries that implement a variety of interpolation schemes, but
|
|
|
|
|
it is difficult to use them in Ceres' automatic differentiation framework.
|
|
|
|
|
Instead, Ceres provides the ability to interpolate one and two dimensional data.
|
|
|
|
|
|
|
|
|
|
The one dimensional interpolation is based on the Cubic Hermite Spline. This
|
|
|
|
|
interpolation method requires knowledge of the function derivatives at the
|
|
|
|
|
control points, however we only know the function values. Consequently, we will
|
|
|
|
|
use the data to estimate derivatives at the control points. The choice of how to
|
2018-10-12 10:39:02 +08:00
|
|
|
compute the derivatives is not unique and Ceres uses the Catmull-Rom Spline
|
2016-07-14 10:10:13 -07:00
|
|
|
variant which uses `0.5 * (p_{k+1} - p_{k-1})` as the derivative for control
|
|
|
|
|
point `p_k.` This produces a first order differentiable interpolating
|
|
|
|
|
function. The two dimensional interpolation scheme is a generalization of the
|
|
|
|
|
one dimensional scheme where the interpolating function is assumed to be
|
|
|
|
|
separable in the two dimensions.
|
|
|
|
|
|
|
|
|
|
This example shows how to use interpolation schemes within the Ceres automatic
|
|
|
|
|
differentiation framework. This is a one dimensional example and the objective
|
|
|
|
|
function is to minimize `0.5 * f(x)^2` where `f(x) = (x - 4.5)^2`.
|
|
|
|
|
|
|
|
|
|
It is also possible to use analytical derivatives with the provided
|
|
|
|
|
interpolation schemes by using a `SizedCostFunction` and defining the
|
|
|
|
|
``Evaluate` function. For this example, the evaluate function would be:
|
|
|
|
|
|
|
|
|
|
```c++
|
|
|
|
|
bool Evaluate(double const* const* parameters, double* residuals, double** jacobians) const {
|
|
|
|
|
if (jacobians == NULL || jacobians[0] == NULL)
|
|
|
|
|
interpolator_.Evaluate(parameters[0][0], residuals);
|
|
|
|
|
else
|
|
|
|
|
interpolator_.Evaluate(parameters[0][0], residuals, jacobians[0]);
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
```
|