Ceres库,从入门到放弃

您所在的位置:网站首页 solveproblems怎么读 Ceres库,从入门到放弃

Ceres库,从入门到放弃

2023-11-16 02:56| 来源: 网络整理| 查看: 265

前言

首先当然是安装了,安装十分简单。

官网文件有很多人翻译了,例如:https://blog.csdn.net/wzheng92/article/details/79634069

使用Ceres库主要来求解有界约束的非线性最小二乘问题的形式:

求和符号后面的我们称之为误差项。这里我们称 ρ(·)为核函数。一般为恒等的函数(这个函数可以针对不同部分对误差的权重进行调整);官方文件称之为LossFunction(损失函数),所以很容易混淆。这个标量函数用来减少他的作用减少异常值对非线性最小二乘问题求解的影响。

里面的fi函数f*()称之为CostFunction(代价函数),

称之为参数块(ParameterBlock),我们通常会把待优化的量放在这里面。这个块的规模一般很小。下面的s.t.意思是subject to (受限于),也就是参数的优化所在范围。

当下面的受限于条件变成负无穷到正无穷,就是我们非线性最小二乘问题。

第一步:模板

ceres求解问题的模板:

//ceres求解步骤 //定义CostFuntion //构建Problem //配置Solver //定义Summary //开始优化Solve //输出结果SUmmary.BriefReport #include using namespace std; struct CostFunction{ template bool operator()(const T* x, T* residual ) const{ residual[0]=cost_function; return true; } //这个步骤是必须的,通过函数重载运算操作符定义代价函数,就是形式里面的f(x)。 //x的维度是下面的dim_2 //residual的维度是dim_1 //可选 //下面这部分,如果结构中需要传递别的数据,可以采取定义数据,然后采用才C++11标准中结构 //体使用初始化列表初始化数据 /* const data_type _a, _b; CostFunction(data_type a,data_type b): _a ( a ), _b ( b ) { } */ }; int main( int argc ,char** argv) { /* 函数其他部分,初始化 带估计量x的初始化 */ //构建问题 Problem problem; //添加误差项 problem.AddResidualBlock( new DiffCostFunction_type(new CostFunction), nullptr, &x ); // DiffCostFunction_type一般可以使用自动求导 AutoDiffCostFunction //或者使用NumericDiffCostFunction //使用时为了区别,定义结构体名为 NumericDiffCostFunction,其他相似,构建问题参数多了一个 // new NumericDiffCostFunction( // new NumericDiffCostFunctor), //第一个参数为生成的costfuntion,尖括号中为误差类型,输入维度,输出维度 //dim_2 的维度是上面结构体定义的x维度 //第二个参数为核函数 //第三个参数为待估计参数的地址,如果是数组,则可以直接传入数组首地址 //说明:这个x是main函数初始化部分定义的 //配置求解器 ceres::Solver::Options options; options.linear_solver_type = ceres::DENSE_QR;//线性方程求解的方法 options.minimizer_progress_to_stdout =true;//输出优化的过程 //优化信息结果 ceres::Solver::Summary summary; //开始优化 ceres::Solve(options, &problem, &problem ); //输出优化结果简报 cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3