Eigen中Levenberg-Marquardt算法的应用

Eigen中Levenberg-Marquardt算法的应用

#include <Eigen/Dense>
#include <iostream>
#include <fstream>
#include <istream>
#include <string>
#include <unsupported/Eigen/NonLinearOptimization>
#include <unsupported/Eigen/NumericalDiff>
template<typename _Scalar, int NX = Eigen::Dynamic, int NY = Eigen::Dynamic>
struct Functor
{
    typedef _Scalar Scalar;
    enum {
        InputsAtCompileTime = NX,
        ValuesAtCompileTime = NY
    };
    typedef Eigen::Matrix<Scalar,InputsAtCompileTime,1> InputType;
    typedef Eigen::Matrix<Scalar,ValuesAtCompileTime,1> ValueType;
    typedef Eigen::Matrix<Scalar,ValuesAtCompileTime,InputsAtCompileTime> JacobianType;

    int m_inputs, m_values;

    Functor() : m_inputs(InputsAtCompileTime), m_values(ValuesAtCompileTime) {}
    Functor(int inputs, int values) : m_inputs(inputs), m_values(values) {}

    int inputs() const { return m_inputs; }
    int values() const { return m_values; }

}; 
struct my_functor : Functor<float>
{
private:
    Eigen::MatrixXf     mVec; 
    int                 mLen; 
public:
    void setValues(Eigen::MatrixXf vec)
    {
        mVec = vec; 
        mLen = vec.rows(); 
    }
    my_functor(void): Functor<float>(5, 500) {}
    my_functor(int src, int dst): Functor<float>(src,dst) {}
    int operator()(const Eigen::VectorXf &x, Eigen::VectorXf &fvec) const
    {
        //此处建立目标函数
        return 0;
    }
    int df(const Eigen::VectorXf &x, Eigen::MatrixXf &fjac) const
    {
        //此处建立雅可比矩阵[一阶导数]
        return 0;
    }
    float getError(const Eigen::VectorXf &x, float &maxError)
    {
        //此处可自行编写误差函数与最大误差检测
        return result; 
    }
}; 
std::vector<float> split(std::string str,std::string pattern)
{
    std::string::size_type pos;
    std::vector<float> result;
    str+=pattern;
    int size=str.size();

    for(int i=0; i<size; i++)
    {
        pos=str.find(pattern,i);
        if(pos<size)
        {
            std::string s=str.substr(i,pos-i);
            float num = std::atof(s.c_str()); 
            result.push_back(num);
            i=pos+pattern.size()-1;
        }
    }
    return result;
}
void computerCalibParameters(Eigen::MatrixXf &values, std::string filename)
{
    //读取测试数据
    const int MAX_POINTS = 500;
    values = Eigen::MatrixXf(MAX_POINTS, 4); 

    std::string szLine, szSub;
    std::ifstream infile; 
    infile.open(filename.c_str()); 

    int totalPoints = 0;
    while(getline(infile, szLine))
    {
        //读取文本文档内容
        totalPoints++; 
    }
    infile.close(); 
}
int _tmain(int argc, _TCHAR* argv[])
{
    for (int i = 130; i < 145; ++i)
    {
        Eigen::VectorXf x = Eigen::VectorXf(5, 1); 
        x << -4.4, 821.04, i, 0, 0; //设置初始值[很重要]
        my_functor fucnctor(x.rows(), 500); 
        Eigen::MatrixXf values; 
        computerCalibParameters(values, "motorpos1.txt"); 
        fucnctor.setValues(values); 
        Eigen::NumericalDiff<my_functor> numDiff(fucnctor);
        Eigen::LevenbergMarquardt<Eigen::NumericalDiff<my_functor>,float> lm(numDiff);
        lm.parameters.maxfev = 100000;
        lm.parameters.xtol = 1.0e-10; 
        int ret = lm.minimize(x);
        std::cout << i << "\t"; 
        float maxError; 
        std::cout << fucnctor.getError(x, maxError) << "\t"; 
        std::cout << maxError << "\t"; 
        std::cout << x.transpose() << "\n"; 
    }
    getchar(); 
    return 0;
}
  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Eigen3Config.cmake和eigen3-config.cmake是用于配置Eigen3库的包配置文件。这些文件包含了关于Eigen3库的信息,如库的路径、头文件路径和编译选项等。这些文件通常由Eigen3库的安装程序生成,并用于帮助CMake在编译时找到并链接Eigen3库。引用 当你在编译使用Eigen3库的项目时,如果编译器无法找到这些文件,就会出现报错信息。这可能是由于Eigen3库的版本与你的项目所需的版本不兼容,或者是库的安装位置或配置有问题。引用 如果你想解决这个问题,可以首先确保你已经正确地安装了Eigen3库,并且安装路径是正确的。然后,你可以尝试在CMakeLists.txt文件添加以下内容,以帮助CMake找到Eigen3库的位置: ``` find_package(Eigen3 3.1 REQUIRED) ``` 这将告诉CMake在编译时查找版本为3.1的Eigen3库。如果你的Eigen3库版本不是3.1,可以根据实际情况修改这个版本号。引用 如果你仍然遇到问题,你可以尝试手动设置Eigen3库的路径,方法是使用cmake-gui或在CMakeLists.txt添加以下内容: ``` set(Eigen3_DIR /path/to/eigen3) ``` 将`/path/to/eigen3`替换为你Eigen3库的实际路径。引用 综上所述,Eigen3Config.cmake和eigen3-config.cmake是用于配置Eigen3库的包配置文件。如果编译时无法找到这些文件,你可以尝试检查库的版本兼容性、安装路径和配置,并根据需要进行相应的修改。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值