Решение нелинейной системы с помощью Ceres Solver: проблема компиляции - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь решить нелинейную систему с помощью Ceres Solver от Google.Пример ниже взят с этой страницы: http://terpconnect.umd.edu/~petersd/460/html/newtonex1z.html

Сначала я создаю класс с именем MatlabExample, где я вычисляю residuals и 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;

}};

Основной файл выглядит следующим образом:

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;
}

При компиляции я получил следующую ошибку:

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(

Это первый раз, когда я использую CeresРешатель, так что я уверен, что что-то упустил ... но я не знаю, что.Есть идеи?

1 Ответ

1 голос
/ 05 июня 2019

Вы неправильно вызываете AddResidualBlock. Сделайте это вместо этого.

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;
}
...