mirror of
https://github.com/ceres-solver/ceres-solver.git
synced 2026-08-30 00:50:37 +08:00
ae65219e04
1. NULL -> nullptr 2. foo.reset(new Bar) -> = foo = std::make_unique<Bar>() 3. Missing std library includes & prefixes Change-Id: I260b261b484554be681ee5a7398126fdb3b3a789
43 lines
2.1 KiB
Markdown
43 lines
2.1 KiB
Markdown
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
|
|
compute the derivatives is not unique and Ceres uses the Catmull-Rom Spline
|
|
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 == nullptr || jacobians[0] == nullptr)
|
|
interpolator_.Evaluate(parameters[0][0], residuals);
|
|
else
|
|
interpolator_.Evaluate(parameters[0][0], residuals, jacobians[0]);
|
|
|
|
return true;
|
|
}
|
|
```
|