一、 矩阵微分问题

0

1-2:

更多性质见https://blog.csdn.net/crazy_scott/article/details/80557814 和书

二、

//
// Created by 高翔 on 2017/12/15.
//
#include <iostream>
#include <opencv2/opencv.hpp>
#include <Eigen/Core>
#include <Eigen/Dense>
#include <math.h>
using namespace std;
using namespace Eigen;int main(int argc, char **argv) {double ar = 1.0, br = 2.0, cr = 1.0;         // 真实参数值double ae = 2.0, be = -1.0, ce = 5.0;        // 估计参数值int N = 100;                                 // 数据点double w_sigma = 1;                   // 噪声Sigma值cv::RNG rng;                                 // OpenCV随机数产生器
vector<double> x_data, y_data;      // 数据for (int i = 0; i < N; i++) {double x = i / 100.0;x_data.push_back(x);y_data.push_back(exp(ar * x * x + br * x + cr) + rng.gaussian(w_sigma));}// 开始Gauss-Newton迭代int iterations = 100;    // 迭代次数double cost = 0, lastCost = 0;  // 本次迭代的cost和上一次迭代的costfor (int iter = 0; iter < iterations; iter++) {Matrix3d H = Matrix3d::Zero();             // Hessian = J^T J in Gauss-NewtonVector3d b = Vector3d::Zero();             // biascost = 0;for (int i = 0; i < N; i++) {double xi = x_data[i], yi = y_data[i];  // 第i个数据点// start your code heredouble ex=exp(ae*xi*xi+be*xi+ce);double error = 0;   // 第i个数据点的计算误差error = yi-ex; // 填写计算error的表达式Vector3d J; // 雅可比矩阵J[0] = -xi*xi*ex;  // de/daJ[1] = -xi*ex;  // de/dbJ[2] = -ex;  // de/dc
H += J * J.transpose(); // GN近似的Hb += -error * J;// end your code here
cost += error * error;}// 求解线性方程 Hx=b,建议用ldlt// start your code here
        Vector3d dx;dx=H.ldlt().solve(b);// end your code hereif (isnan(dx[0])) {cout << "result is nan!" << endl;break;}if (iter > 0 && cost > lastCost) {// 误差增长了,说明近似的不够好cout << "cost: " << cost << ", last cost: " << lastCost << endl;break;}// 更新abc估计值ae += dx[0];be += dx[1];ce += dx[2];lastCost = cost;cout<<"iterate: "<<iter<<endl;cout<<"ae="<<ae<<" be="<<be<<" ce="<<ce<<endl;cout<<"cost= "<<cost<<endl;// end your code here
cout << "total cost: " << cost << endl;}cout << "estimated abc = " << ae << ", " << be << ", " << ce << endl;return 0;
}

代码如上。

自写部分:

 double ex=exp(ae*xi*xi+be*xi+ce);double error = 0;   // 第i个数据点的计算误差 error = yi-ex; // 填写计算error的表达式 Vector3d J; // 雅可比矩阵 J[0] = -xi*xi*ex; // de/da J[1] = -xi*ex; // de/db J[2] = -ex; // de/dc  H += J * J.transpose(); // GN近似的H b += -error * J;然后解个方程

自己开始推了一大堆后来发现按照提示写很简单就完了。

需要注意的地方:

  每一个点引入一个error,在内层循环中只计算了单个error的J矩阵,并且不考虑外面的平方。内层就是f(x),所以形式都很简单,然后在外层把算出来的H和b加起来最后统一求解,这里的加法原理是讲得通的。

  一开始我解得欲仙欲死就是因为想到这个函数是一百个点误差平方加起来,之后对这个大函数求一次J和H然后解方程直接得到迭代值,最后出了问题。

  其实这么做理论上也是对的,一会再试试。(PS:没有试出来)

运行结果如下:

转载于:https://www.cnblogs.com/CaptainLL/p/10831072.html

高博SLAM基础课第四讲——非线性优化相关推荐

  1. 高博SLAM基础课第五讲——PnP非线性优化

    这一题很重要 #include <Eigen/Core> #include <Eigen/Dense>using namespace Eigen;#include <ve ...

  2. 高博SLAM十四讲书本程序学习——第3讲 三维空间刚体运动

    小白高博SLAM十四讲书本程序学习_1 第3讲 三维空间刚体运动 在高博原始注释上,针对我自己不明白的部分,做额外注释 如果有错误的地方,请大家指点指点 博文目录 一.P.48 eigenMatrix ...

  3. 深蓝视觉SLAM课程第四讲--相机模型,非线性优化(G2O)

    课程Github地址:https://github.com/wrk666/VSLAM-Course/tree/master 0. 内容 对应于十四讲中的第5讲和第6讲 回顾十四讲P24-26 1. 针 ...

  4. 学习高博SLAM(1)

    这几天按照高博的博客做了一起做RGB-D SLAM (1)和(2) ,,其中大部分步骤都没问题 开发环境是ubuntu14.04+indigo 有几个问题就是: (1)我的电脑不能加载PPA,原因是: ...

  5. slam入门——十四讲笔记(一)

    文章目录 第1讲 预备知识 第1部分 数学基础 第2讲 初识SLAM 2.1 引子:小萝卜的例子 2.2 经典视觉SLAM框架 2.3 SLAM问题的数学表述 2.4 实践:编程基础 1. 安装Lin ...

  6. 「SLAM」十四讲:第1讲 预备知识

    1 本书内容 SLAM:Simultaneous Localization and Mapping,同时定位与地图构建:SLAM的目的是解决"定位"与"地图构建" ...

  7. 高博SLAM第十章优化代码出错解决办法

    第一部分:g2o代码错误修正 ** 问题一 ** /home/wh/code/slambook/ch10/g2o_custombundle/ceres/autodiff.h:225:11: error ...

  8. 《视觉SLAM十四讲 第二版》笔记及课后习题(第一讲)

    前言 之所以想要写这个系列的博客,是因为想要总结一下高博的<SLAM视觉十四讲第二版>的各章内容以及自己对书后习题的一些做法,也算是对自己学习过程的一个总结和回顾.博客分为两个大部分,即读 ...

  9. 视觉SLAM十四讲CH6代码解析及课后习题详解

    gaussNewton.cpp #include <iostream> #include <chrono> #include <opencv2/opencv.hpp> ...

最新文章

  1. LineMod模板匹配算法的原理与实现 (原理及公式)
  2. 终端html页面,HTML5的终端适配
  3. 干货丨机器学习入门(经典好文,强烈推荐)
  4. 区块链BaaS云服务(24)秘猿科技CITA
  5. linux redis php,Linux下编译redis和phpredis的方法
  6. C++获取字符串长度详解
  7. 修改默认的pip版本为对应python2.7
  8. 腾讯视频下载下来的视频在哪里
  9. 前端之BOM和DOM
  10. [IE编程] 打开/关闭IE8的光标浏览模式(Caret Browsing)
  11. android系统应用程序,Android调用系统应用程序
  12. VC2008界面编程
  13. Java项目:JSP酒店客房管理系统
  14. 彻底修改 Windows 系统用户名
  15. 如何进行航拍全景摄影(上)
  16. Volatility3用法
  17. 【bzoj3240 洛谷P1397】矩阵游戏[NOI2013](矩阵乘法+卡常)
  18. 【转载】矩阵求导、几种重要的矩阵及常用的矩阵求导公式
  19. UE4 统计数据命令描述
  20. thinksns的部署

热门文章

  1. 三维重建之多频外差解包裹学习笔记
  2. 【Hadoop】谷歌的三篇论文(GFS、MapReduce分布式计算模型 、BigTable大表)
  3. 宝塔wordpress安装及使用(宝塔wordpress建站教程)
  4. 分布式存储系统 之 数据备份
  5. c语言课后答案上海交通,上海交通大学继续教育学院2012春——程序设计(C)作业1(有答案)...
  6. 清晰思路带你掌握如何运用循环打印各种图案(新手向)
  7. html check选中状态,html checkbox选中
  8. ❤️❤️❤️Unity废柴看过来,手把手教你做植物大战僵尸(二)—— 序列帧动画
  9. mysql vb.net odbc_在VB.net中连接MySql的类库_MySQL
  10. 在线代码格式化网址:https://tool.oschina.net/codeformat/xml