Difference between revisions of "CPP/Eigen/LevenbergMarquardt"

From ProgrammingExamples
< CPP
Jump to: navigation, search
 
Line 12: Line 12:
 
   {
 
   {
 
     // Implement y = x^2
 
     // Implement y = x^2
     fvec(0) = x(0)*x(0);
+
     fvec(0) = x(0)*x(0) - 5.0 * x(0);
 
     return 0;
 
     return 0;
 
   }
 
   }
Line 24: Line 24:
  
 
   int inputs() const { return 1; }
 
   int inputs() const { return 1; }
   int values() const { return 0; }
+
   int values() const { return 1; } // number of constraints
 
};
 
};
  
Line 34: Line 34:
 
   std::cout << "x: " << x << std::endl;
 
   std::cout << "x: " << x << std::endl;
  
  // do the computation
 
 
   MyFunctor functor;
 
   MyFunctor functor;
 
   Eigen::LevenbergMarquardt<MyFunctor, float> lm(functor);
 
   Eigen::LevenbergMarquardt<MyFunctor, float> lm(functor);
 
   lm.minimize(x);
 
   lm.minimize(x);
  
   std::cout << "x: " << x << std::endl;
+
   std::cout << "x that minimizes the function: " << x << std::endl;
  std::cout << "lm.fvec: " << lm.fvec << std::endl;
+
  
 
   return 0;
 
   return 0;

Latest revision as of 18:44, 4 November 2011

ProjectPoints.cpp

#include <iostream>
 
#include <Eigen/Dense>
 
#include <unsupported/Eigen/NonLinearOptimization>
 
struct MyFunctor
{
  int operator()(const Eigen::VectorXf &x, Eigen::VectorXf &fvec) const
  {
    // Implement y = x^2
    fvec(0) = x(0)*x(0) - 5.0 * x(0);
    return 0;
  }
 
  int df(const Eigen::VectorXf &x, Eigen::MatrixXf &fjac) const
  {
    // Implement dy/dx = 2*x
    fjac(0) = 2.0f * x(0);
    return 0;
  }
 
  int inputs() const { return 1; }
  int values() const { return 1; } // number of constraints
};
 
 
int main(int argc, char *argv[])
{
  Eigen::VectorXf x(1);
  x(0) = 2;
  std::cout << "x: " << x << std::endl;
 
  MyFunctor functor;
  Eigen::LevenbergMarquardt<MyFunctor, float> lm(functor);
  lm.minimize(x);
 
  std::cout << "x that minimizes the function: " << x << std::endl;
 
  return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.6)
 
PROJECT(LevenbergMarquardt)
include_directories(/media/portable/src/Eigen)
# FIND_PACKAGE(Eigen3 REQUIRED)
# INCLUDE(${Eigen_USE_FILE})
 
include_directories(${EIGEN3_INCLUDE_DIR} ${EIGEN3_INCLUDE_DIR}/unsupported/)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET")
 
ADD_EXECUTABLE(LevenbergMarquardt LevenbergMarquardt.cpp )