I am trying to solve a nonlinear system using Ceres Solver by Google. The example below comes from this page: http://terpconnect.umd.edu/~petersd/460/html/newtonex1z.html
I first create a class called MatlabExample
, where I compute the residuals
and jacobians
:
class MatlabExample
: public SizedCostFunction<2,2> {
public:
virtual ~MatlabExample() {}
virtual bool Evaluate(double const* const* parameters,
double* residuals,
double** jacobians) const {
double x1 = parameters[0][0];
double x2 = parameters[0][1];
residuals[0] = 2*x1+x1*x2-2;
residuals[1] = 2*x2-x1*pow(x2,2)-2 ;
if (jacobians != NULL && jacobians[0] != NULL) {
jacobians[0][0] = 2+x2;
jacobians[0][1] = x1;
jacobians[1][0] = -pow(x2,2);
jacobians[1][1] = 2-2*x1*x2;
}
return true;
} };
The main file is as follows:
int main(int argc, char** argv) {
google::InitGoogleLogging(argv[0]);
double x[1][2]={{1.00,1.00}};
Problem problem;
CostFunction* cost_function = new MatlabExample;
problem.AddResidualBlock(cost_function, NULL, &x);
Solver::Options options;
options.minimizer_progress_to_stdout = true;
Solver::Summary summary;
Solve(options, &problem, &summary);
std::cout << summary.BriefReport() << "\n";
std::cout << "x[0]= " << x[0][0]
<< "; x[1]= " << x[0][1] << "\n";
return 0;
}
When compiling, I got the following error:
mytest_ceres.cpp:262:11: error: no matching member function for call to 'AddResidualBlock'
problem.AddResidualBlock(cost_function, NULL, &x);
/usr/local/include/ceres/problem.h:222:19: note: candidate function not viable: cannot convert argument of incomplete type
'void *' to 'const std::vector<double *>' for 3rd argument
ResidualBlockId AddResidualBlock(
This is the first time I am using Ceres Solver, so I am sure I am missing something... but I do not know what. Any ideas?
You are calling AddResidualBlock incorrectly. Do this instead.
int main(int argc, char** argv) {
google::InitGoogleLogging(argv[0]);
double x[]= {1.00,1.00};
Problem problem;
CostFunction* cost_function = new MatlabExample;
problem.AddResidualBlock(cost_function, NULL, x);
Solver::Options options;
options.minimizer_progress_to_stdout = true;
Solver::Summary summary;
Solve(options, &problem, &summary);
std::cout << summary.BriefReport() << "\n";
std::cout << "x[0]= " << x[0]
<< "; x[1]= " << x[1] << "\n";
return 0;
}