How to use ceres-solver to solve high dimensional non-linear problem?

412 Views Asked by At

     I need to solve the optimization problem: enter image description here. A and b are known. I use Zero to represent A and b to facilate the expression in the following code. The error is caused by problem.AddResidualBlock(cost_function, nullptr, &X); because the third argument needs to be double type and X is a vector with 50 elements. Can you give me some advice?

#include <cmath>
#include <ceres/ceres.h>
#include <Eigen/Core>
#include <Eigen/Eigen>
#include <Eigen/Core>
#include <Eigen/Dense>
#include <Eigen/StdVector>


#define PhaseNums 25

using namespace std;
using namespace ceres;
using namespace Eigen;

struct GammaResidual
{
    GammaResidual(const MatrixXf A, const VectorXf b) : A_(A), b_(b) {}

    template <typename T>
    bool operator()(const T* const x, T* residual) const {
        residual[0] = (A_ * x[0] - b_).transpose() * (A_ * x[0] - b_);
        return true;
    }

private:
    const MatrixXf A_;
    const VectorXf b_;
};

int main()
{
    MatrixXf A = MatrixXf::Zero(2 * PhaseNums, 2 * PhaseNums);
    VectorXf b = VectorXf::Zero(2 * PhaseNums);
    VectorXf X = VectorXf::Zero(2 * PhaseNums);

    Problem problem;
    CostFunction* cost_function = new AutoDiffCostFunction<GammaResidual, 1, 1>(
            new GammaResidual(A, b));
    problem.AddResidualBlock(cost_function, nullptr, &X);

    ceres::Solver::Options options; 
    options.minimizer_progress_to_stdout = true; 

    ceres::Solver::Summary summary;  
    ceres::Solve(options, &problem, &summary); 
    cout << summary.BriefReport() << endl;
}

1

There are 1 best solutions below

0
On

I guess that If your X is a vector, you need to loop through it and add a residual a residual block for each x. Makes sense?