对于最小二乘问题,ceres::Problem
可以应对。
对于一般的无约束最小化问题,使用 ceres::GradientProblem
求解。
对应的cost function有
- 继承
FirstOrderFunction
,自定义factor,手写gradient和cost - 使用
AutoDiffFirstOrderFunction
,只需要手写cost
这个问题的一般最小化解法如下
// ----------------------------- 手动求导 ----------------------------
class FirstOrderFunctionExample : public ceres::FirstOrderFunction {
public:
FirstOrderFunctionExample(const std::vector<double>& x_data,
const std::vector<double>& y_data)
: x_data_(x_data), y_data_(y_data) {
}
virtual ~FirstOrderFunctionExample() = default;
virtual bool Evaluate(const double* parameters, double* cost,
double* gradient) const {
assert(parameters != nullptr);
assert(cost != nullptr);
assert(gradient != nullptr);
const double a = parameters[0];
const double b = parameters[1];
const double c = parameters[2];
cost[0] = 0;
if (gradient != nullptr)