课程Github地址:https://github.com/wrk666/VSLAM-Course/tree/master

5. T5矩阵微分

5.1 实值行向量偏导

这块儿之前一直不太懂,趁着这个机会补一补。

看结论的话直接到5.5节,稍微理解一下的话再看看5.1和5.2,具体矩阵微分的引出在5.3。

行向量偏导和列向量偏导对应,对列向量偏导一般叫做梯度。


求f(X)f(X)f(X)对XXX的行向量偏导

vec()是矩阵的向量化函数,将矩阵变为列向量。则按照上面的步骤:
对于矩阵
[X11⋯X1n⋮⋱⋮Xm1⋯Xmn]\begin{bmatrix} X_{11} & \cdots &X_{1n} \\ \vdots & \ddots & \vdots \\ X_{m1} & \cdots & X_{mn} \end{bmatrix} ⎣⎢⎡​X11​⋮Xm1​​⋯⋱⋯​X1n​⋮Xmn​​⎦⎥⎤​
先将X列向量化,
[X11⋮Xm1⋮X1n⋮Xmn]\begin{bmatrix} X_{11} \\ \vdots\\ X_{m1}\\ \vdots \\ X_{1n}\\ \vdots \\ X_{mn} \end{bmatrix} ⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​X11​⋮Xm1​⋮X1n​⋮Xmn​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​

转置变为行向量,
[X11⋯Xm1⋯X1n⋯Xmn]=vecT(X)\begin{bmatrix} X_{11} & \cdots & X_{m1} &\cdots & X_{1n} & \cdots X_{mn} \end{bmatrix}=vec^T(X) [X11​​⋯​Xm1​​⋯​X1n​​⋯Xmn​​]=vecT(X)
即可求得:

若直接以矩阵形式定义f(X)f(X)f(X)在XXX处的偏导,那就是求Jacobian矩阵(Jacobian矩阵也叫协(同)梯度矩阵,也有一些性质,目前用不到就暂不做介绍):

所以Jacobian矩阵就为:

行向量偏导与Jacobian有以下关系:


简单来说就是向量转矩阵,矩阵转向量。

5.2 实列向量偏导

m×1m\times 1m×1列向量偏导算子(即梯度算子):

标量函数对列向量的偏导:

对矩阵的梯度算子(列向量偏导算子),将矩阵列向量化再逐个求导:

所以易得标量函数对矩阵X的的梯度矩阵的列向量形式为:

将上述结果矩阵化即得标量函数f(X)f(X)f(X)的梯度矩阵,这是我们在优化中很常用的:

简单来说,对标量函数f(X)f(X)f(X):

求其Jacobian矩阵:就是将XXX转置,分别对XijX_{ij}Xij​求偏导;
求梯度矩阵:直接对XijX_{ij}Xij​求偏导
所以也可得:Jacobian矩阵是梯度矩阵的转置:



负梯度方向被称作变元x\boldsymbol{x}x的的梯度流,记作:


梯度向量指出了函数f(X)f(X)f(X)的最大增大率,所以要实现梯度下降就得采用负梯度方向。

5.3 实值标量函数的Hessian矩阵




简单来说,求Hessian矩阵就是先求列向量偏导,再求行向量偏导。

5.4 矩阵微分

由多元函数的全微分引出矩阵的微分:







相对于实值函数f(⋅)f(\cdot)f(⋅)还有向量函数f(⋅)\boldsymbol{f}(\cdot)f(⋅),实矩阵函数F(⋅)\boldsymbol{F}(\cdot)F(⋅),目前用不到,暂不做介绍。

5.4部分小结

实矩阵A(Jocabian矩阵)即为实值标量函数f(X)f(X)f(X)相对于XXX的一阶偏导矩阵。
且:

  1. Jocabian矩阵是唯一的
  2. Jocabian是梯度矩阵的转置,求f(X)f(X)f(X)对于XXX的梯度矩阵可由雅可比的转置直接给出(前面已经说过了)。
  3. 矩阵微分可以写成规范形式df(X)=tr(AdX)df(X)=tr(AdX)df(X)=tr(AdX)

5.5 实矩阵微分的计算

实矩阵微分两个基本性质:

实矩阵微分的常用计算公式:

矩阵乘积的微分:



后面的可能不太常用,贴个结论:




介绍到这里,T5应该能很轻松拿下了。

其实还有很多东西需要再看,这里讲的主要是实值函数的矩阵/向量微分,第1问里面求的是向量对向量的微分,这里放几个博客:
矩阵求导术(上):主要是实值函数的矩阵微分。
矩阵求导术(下):主要是向量,矩阵函数的矩阵微分。

需要注意的是,向量对向量的微分的定义有些杂乱,不太清楚哪个是正确的

第1种定义:

第2种定义:
上面是列向量对列向量的导数,但是这篇博客中说的是列向量对行向量的微分以及行向量对列向量的微分

但是还是暂且接受下面这个结论来做题:
df=∂fT∂xdxd\bm f=\frac{\partial{\bm{f}^T}}{\partial{\bm{x}}}d\bm x df=∂x∂fT​dx

我的作业T5:
作业中求的应该是导数而不是微分,严格来写应该是
∂Ax∂x\frac{\partial{\bm{Ax}}}{\partial{\bm x}} ∂x∂Ax​
说是对行向量求微分,(如果是对行向量的话,那上面的第二个)但是我搞不清楚了…


2022.3.7更新
其实实用的主要是向量对向量的求导,关键在于这个导数是怎么定义的,有地方定义成∂列向量∂列向量\frac{\partial 列向量}{\partial 列向量}∂列向量∂列向量​,有地方定义成∂列向量∂行向量\frac{\partial 列向量}{\partial 行向量}∂行向量∂列向量​,不管它怎么定义,我们求向量对向量的导数时,先抓住原则1:

先按照坟墓相同的维数分别对分母的各个元素求导
若是∂列向量∂列向量\frac{\partial 列向量}{\partial 列向量}∂列向量∂列向量​的定义,则按原则2:

最终得到的求导结果就是:

如果是∂列向量∂行向量\frac{\partial 列向量}{\partial 行向量}∂行向量∂列向量​的定义,那么原则2就是:按照分子展开
《14讲》的附录B就是这样定义的:

妈妈再也不用担心我的向量对向量求导了~






不知道有没有别的更简洁的方法,网上有别的答案,但是过程太短,我看不太懂,比如这篇里面的:

还有助教给的这个性质我也理解不了

看了b站的一个视频,算是比较清楚地理解了矩阵微分(向量对向量求导)



6. T6 手写高斯牛顿的曲线拟合



gaussnewon.cpp:

 for (int i = 0; i < N; i++) {double xi = x_data[i], yi = y_data[i]; // 第i个 数 据 点// start your code heredouble error = yi - exp(ae * xi * xi + be * xi + ce); // 第i个数 据 点 的 计 算 误 差Vector3d J; // 雅 可 比 矩 阵(是 一 个 列 向 量)J[0] = -xi * xi * exp(ae * xi * xi + be * xi + ce); // de/daJ[1] = -xi * exp(ae * xi * xi + be * xi + ce); // de/dbJ[2] = -exp(ae * xi * xi + be * xi + ce); // de/dc//Hx=bH += J * J.transpose (); // GN近 似 的Hb += -error * J;// end your code herecost += error * error;}// 求 解 线 性 方 程 Hx=b, 建 议 用ldlt// start your code hereVector3d dx = H.ldlt ().solve(b); //MatrixBase的Cholesky分 解 求 解 线 性 方 程 组// end your code here

CMakeLists.txt:

cmake_minimum_required (VERSION 3.21)
project(T6)
set(CMAKE_CXX_STANDARD 11)# OpenCV
find_package(OpenCV REQUIRED)
include_directories (${ OpenCV_INCLUDE_DIRS })# Eigen
include_directories ("/usr/include/eigen3")add_executable(gaussnewton gaussnewton.cpp)
target_link_libraries (gaussnewton ${OpenCV_LIBS })

7. T7 批量最大似然估计






3.T3 鱼眼模型与去畸变

一些opencv的使用:
openCV 需要显示的图片太大超出了屏幕范围
Mat inputImg,outputImg;
cv::resize(inputImg,outputImg,cv::Size(1280,720)); //Size(1280,720)缩放后的图片尺寸

知道这里的point[2]是什么意思了,求的是原来的图像距离光心的距离r


上面这个不对,本来从像素到相机系就已经能进行去畸变了,去完畸变之后在转到像素系就行了,没必要求P0P_0P0​的坐标。

鱼眼模型讲的好

助教的作业


剩下的可以看开头提到的Github,作业和程序都在里面。

深蓝学院-视觉SLAM课程-第4讲作业(T5矩阵微分,T6手写高斯牛顿,T7批量MLE)相关推荐

  1. 深蓝学院-视觉SLAM课程-第2讲作业

    课程Github地址:https://github.com/wrk666/VSLAM-Course/tree/master 1. 基础知识 需要复习现代和矩阵论的知识. 特征值,特征向量有啥用? 有了 ...

  2. 深蓝学院-视觉SLAM课程-第7讲作业:SLAM中g2o入门详解,直接法BA

    1. 引言 在SLAM中,BA是个重要的部分,前后端很多地方都用得到,而g2o是一个很重要的使用图优化求解优化问题的库,所以有必要熟练掌握,尽管有了些C++的底子,但是看g2o的代码还是比较吃力,所以 ...

  3. 深蓝学院-视觉SLAM课程-第6讲作业

    课程Github地址:https://github.com/wrk666/VSLAM-Course/tree/master 第6讲作业 2. T2 2.1 光流文献综述 文献还没读完,这部分参考博客 ...

  4. 深蓝学院-视觉SLAM课程-第6讲笔记

    课程Github地址:https://github.com/wrk666/VSLAM-Course/tree/master 0. 内容 仍然是前端的内容,估计位姿,不过不是特征点法,而是另外的方法. ...

  5. 深蓝学院-视觉SLAM课程-第1讲笔记

    课程Github地址:https://github.com/wrk666/VSLAM-Course/tree/master 1. 基础知识 一些图像处理方面的工作需要借助ML方法来完成:物体识别,检测 ...

  6. 深蓝学院-视觉SLAM课程-第2讲笔记--三维空间刚体运动

    课程Github地址:https://github.com/wrk666/VSLAM-Course/tree/master 0. 内容 C++没有矩阵的运算,用别人的库来进行矩阵运算,其中Eigen库 ...

  7. 深蓝学院-视觉SLAM课程-第3讲笔记-李群和李代数

    课程Github地址:https://github.com/wrk666/VSLAM-Course/tree/master 0. 内容 1. 什么是群 为什么要引入群? 因为求旋转矩阵或者变换矩阵的导 ...

  8. 深蓝学院-视觉SLAM课程-第7讲笔记

    课程Gitbug地址:https://github.com/wrk666/VSLAM-Course/tree/master 0. 内容 这讲来讲后端 之前的最小二乘的方法属于批量方法,较为简单,另一种 ...

  9. 深蓝学院-视觉SLAM课程学习课后题

    一. 第一节课习题# 标题 1.熟悉linux (1)可以通过 sudo apt-get install <软件名>的方式安装软件 当自己下载了软件压缩包之后(tar.gz文件),可以解压 ...

  10. slam十四讲-ch6-非线性优化(包含手写高斯牛顿、使用g2o库、使用ceres库三种方法的源码详细注释)

    一.自写高斯-牛顿法 该程序是要进行一个非线性优化,对非线性函数的系数进行优化 y=exp(ax2+bx+c) 给定初始的系数 ae,be,ce(估计的) ar,br,cr(真实的) 源码如下: // ...

最新文章

  1. 爱情也许是最忧伤的童话
  2. 一文拆解中国火星车着陆全过程
  3. WCF-学习笔记概述之计算服务(1)
  4. Java实现BASE64编解码
  5. 图片点击放大并可点击旋转插件(1)-jquery.artZoom.js
  6. shell模拟php多进程从redis获取数据(多个redis实例)
  7. 利用go语言创建web server的两种方式
  8. How to get the xpath by clicking an html element
  9. Python学习入门基础教程(learning Python)--5.7 Python文件数据记录存储与处理
  10. [Android/Icon] 分享一个图标/Icon制作网站
  11. kotlin使用StateFlow的collect出错This is an internal kotlinx.coroutines API
  12. ios 判断iPhone、iPad硬件型号
  13. 使用canvas画出满天繁星
  14. 手把手教你备份 nvidia jetson agx xavier 系统(亲测有效、超详细)
  15. Unity官方中文版(有生之年终于等到了)
  16. 前沿|PaddlePaddle开源项目DeepNav“无人船”炼成记(二)
  17. word如何去除表格中高亮部分(表格属性-边框和底纹)
  18. 【微信小程序】组件之页面布局
  19. 2020年起重机司机(限门式起重机)考试资料及起重机司机(限门式起重机)新版试题
  20. VS code ssh 远程连接超算

热门文章

  1. pdf怎么添加水印?
  2. Maven 打包-添加第三方包、依赖包 mvn clean package
  3. SLAM常见面试题集锦
  4. 计算机课代表总结与反思,生物课代表总结与反思(38页)-原创力文档
  5. java类库编程_进阶Java编程(5)基础类库
  6. 必须正视TD-SCDMA可能存在的重大技术错误(ZT)
  7. 攻防世界 reverse新手题 logmein
  8. python爬取网易云音乐评论并制作词云
  9. 60秒倒计时钟单片机实物程序
  10. 找茬小游戏微信小程序源码自带流量主功能+前端+后端+教程