技术标签: 矩阵 SLAM从小白到大黑
本篇,多出自其他大佬的文章,厚着脸皮总结组织一下
参考链接
https://blog.csdn.net/wangshuailpp/article/details/80209863
https://www.cnblogs.com/AndyJee/p/3846455.html
https://blog.csdn.net/wangshuailpp/article/details/80209863
https://www.cnblogs.com/AndyJee/p/3846455.html
(1)R(A)< r(A|B),方程组无解
(2)r(A)=r(A|B)=n,方程组有唯一解
(3)r(A)=r(A|B) < n,方程组有无穷解
(4)r(A)>r(A|B),这种情况不存在
其中r()代表矩阵的秩,A|B是增广矩阵,n是X未知数个数。
QR分解?LTLD分解、Cholesky分解、SVD分解?
min ∥ A x − b ∥ 2 2 A ∈ R m ∗ n x ∈ R n b ∈ R m \min \|A x-b\|_{2}^{2} \\ A \in R^{m^{*} n} \quad x \in R^{n} \quad b \in R^{m} min∥Ax−b∥22A∈Rm∗nx∈Rnb∈Rm
m个方程求解n个未知数,有三种情况:
通常我们遇到的都是超定问题, 此时A = = = b的解是不存在的,从而转向解最小二乘问题: f ( x ) = ∥ A x − b ∥ f(x)=\|A x-b\| f(x)=∥Ax−b∥ ,其中 f ( x ) \mathrm{f}(\mathrm{x}) f(x) 为凸函数。令一阶导数为 0, 得到: A T A x − A T b = 0 A^{T} A x-A^{T} b=0 ATAx−ATb=0,称之为正规方程
一般解: x = ( A T A ) − 1 A T b x=\left(A^{T} A\right)^{-1} A^{T} b x=(ATA)−1ATb可见一般在视觉SLAM中后端优化就是约束项大于未知数的个数(超定问题), 采用最小二乘问题求 解
1.正交矩阵
矩阵和它的转置矩阵的乘积为单位矩阵,, 那么这个矩阵就是正交矩阵。李群中旋转矩阵就是一种正交阵,所以一般其逆的形式直接写成转置。
M T M = I ⟺ M T = M − 1 \mathbf{M}^{T} \mathbf{M}=\mathbf{I} \Longleftrightarrow \mathbf{M}^{T}=\mathbf{M}^{-1} MTM=I⟺MT=M−1
为什么叫正交矩阵呢?因为如果我们把这个矩阵写成向量的形式, 那么这些向量除了自己和自己的点积为1,其他任意两个不同向量之间的点积全部为0.而向量点积为0的情况叫正交。正交矩阵是因此得名的
乘以一个对角矩阵,好比对每个坐标轴进行缩放,包括方向,和压缩。
和对角矩阵相比,三角矩阵要多一些角上的元素,那么这些元素有什么作用呢?
矩阵分解就是分解成上面三种形式,综上所述,矩阵分解的几何意义就是把一个线性变换分解开来,分别是缩放,切边和旋转。矩阵因子的作用就是要把缩放,切边和旋转分解出来理解一个矩阵的作用。
当A是非奇异的实方阵(满秩,只有方阵才存在奇异性,奇异矩阵秩亏,行列式为0,非奇异矩阵满秩,行列式不为0),实方阵A能够表示成一个正交矩阵Q(QTQ=I)与上三角矩阵R的积。
QR分解的实际计算有很多方法,例如 Givens 旋转、Householder 变换,以及 Gram-Schmidt正交化等等。A=Q*R称为A的QR分解。如下图所示
正交矩阵可以看成是坐标系的转换。从几何上QR分解,就是先进行旋转,然后再进行切变的过程。
设 A A A 有 QR 分解:
A = Q ( R 0 ) = Q 1 R A=Q\left(\begin{array}{l} R \\ 0 \end{array}\right)=Q_{1} R A=Q(R0)=Q1R
其中Q是正交矩阵, Q 1 \bf{Q_{1}} Q1是 Q \bf {Q} Q的前n列组成的矩阵,R是对角线上元素均为正数的上三角矩阵。
由于正交矩阵保持范数不变, 所以等价于
∥ Q T ( A x − b ) ∥ 2 = min { ∥ Q T ( A v − b ) ∥ 2 : v ∈ R n } \left\|Q^{T}(A x-b)\right\|_{2}=\min \left\{\left\|Q^{T}(A v-b)\right\|_{2}: v \in R^{n}\right\} ∥∥QT(Ax−b)∥∥2=min{
∥∥QT(Av−b)∥∥2:v∈Rn}
记
d = Q T b = ( Q 1 T Q 2 τ ) b = ( d 1 d 2 ) \boldsymbol{d}=Q^{T} \boldsymbol{b}=\left(\begin{array}{l} Q_{1}^{T} \\ Q_{2}^{\tau} \end{array}\right) \\ \boldsymbol{b}=\left(\begin{array}{l} \boldsymbol{d}_{1} \\ \boldsymbol{d}_{2} \end{array}\right) d=QTb=(Q1TQ2τ)b=(d1d2)
则有
∥ Q T ( A x − b ) ∥ 2 2 = ∥ ( R 0 ) x − ( d 1 d 2 ) ∥ 2 2 = ∥ R x − d 1 ∥ 2 2 + ∥ d 2 ∥ \left\|Q^{T}(A x-b)\right\|_{2}^{2}=\left\|\left(\begin{array}{l} R \\ 0 \end{array}\right) x-\left(\begin{array}{l} d_{1} \\ d_{2} \end{array}\right)\right\|_{2}^{2}=\left\|R x-d_{1}\right\|_{2}^{2}+\left\|d_{2}\right\| ∥∥QT(Ax−b)∥∥22=∥∥∥∥(R0)x−(d1d2)∥∥∥∥22=∥Rx−d1∥22+∥d2∥
因此, x \boldsymbol{x} x 是当且仅当方程 R x = d 1 R \boldsymbol{x}=\boldsymbol{d}_{1} Rx=d1 的解。所以 解可由上三角方程组 R x = d 1 R \boldsymbol{x}=\boldsymbol{d}_{1} Rx=d1 求得。
QR 分解方法的基本步骤如下:
QR 分解方法比正规化方法有较好的数值稳定性, 并且计算结果比正规化方法要精确。
当然, Q R \mathrm{QR} QR 方法比正规化方法会付出更大的计算代价。
对称矩阵A可以分解成一个下三角矩阵L(Lower下)和一个对角矩阵D(Diagonal对角线)以及一个下三角矩阵L的转置LT三个矩阵相乘的形式。如下式
A = L D L T = ( 1 0 0 L 21 1 0 L 31 L 32 1 ) ( D 1 0 0 0 D 2 0 0 0 D 3 ) ( 1 L 21 L 31 0 1 L 32 0 0 1 ) \mathbf{A}=\mathbf{L D L}^{\mathrm{T}}=\left(\begin{array}{ccc} 1 & 0 & 0 \\ L_{21} & 1 & 0 \\ L_{31} & L_{32} & 1 \end{array}\right)\left(\begin{array}{ccc} D_{1} & 0 & 0 \\ 0 & D_{2} & 0 \\ 0 & 0 & D_{3} \end{array}\right)\left(\begin{array}{ccc} 1 & L_{21} & L_{31} \\ 0 & 1 & L_{32} \\ 0 & 0 & 1 \end{array}\right) A=LDLT=⎝⎛1L21L3101L32001⎠⎞⎝⎛D1000D2000D3⎠⎞⎝⎛100L2110L31L321⎠⎞
由A的分解可知 A T = A \bf A^{T}=A AT=A,即A的转置等于A矩阵本身。所以,此方法针对对称矩阵
一般无法得到满足对称矩阵A,因此需要使对ATA(满足对称)进行分解。将求解问题转换成下面的式子:
A T A x = A T b A^{T} A x=A^{T} b ATAx=ATb
由于 r ( A ) = n \mathrm{r}(\mathrm{A})=\mathrm{n} r(A)=n, 所以 A T A \bf{A^{T}A} ATA是对称(正定)矩阵, 式子有唯一解, 使用LDLT分解的步骤是:
LDLT分解速度要快于QR分解。
Cholesky分解是LDLT分解的一种特殊形式,也就是其中的D是单位矩阵。正定对称矩阵 A可以分解成一个下三角矩阵L和这个下三角矩阵L的转置LT相乘的形式。如下式
A = L L T = ( L 11 0 0 L 21 L 22 0 L 31 L 32 L 33 ) ( L 11 L 21 L 31 0 L 22 L 32 0 0 L 33 ) \mathbf{A}=\mathbf{L L}^{\mathbf{T}}=\left(\begin{array}{ccc} L_{11} & 0 & 0 \\ L_{21} & L_{22} & 0 \\ L_{31} & L_{32} & L_{33} \end{array}\right)\left(\begin{array}{ccc} L_{11} & L_{21} & L_{31} \\ 0 & L_{22} & L_{32} \\ 0 & 0 & L_{33} \end{array}\right) A=LLT=⎝⎛L11L21L310L22L3200L33⎠⎞⎝⎛L1100L21L220L31L32L33⎠⎞
一般无法得到满足对称矩阵A,因此需要使对ATA(满足对称)进行分解。将求解问题转换成下面的式子:
A T A x = A T b A^{T} A x=A^{T} b ATAx=ATb
由于 r ( A ) = n \mathrm{r}(\mathrm{A})=\mathrm{n} r(A)=n, 所以 A T A \bf{A^{T}A} ATA是对称(正定)矩阵, 式子有唯一解, 使用LDLT分解的步骤是:
Cholesky分解要快于LDLT分解。
SVD分解不仅可以解决满秩最小二乘问题,最重要的是可以解决亏秩最小二乘问题(r(A)< n,理解下其实就相当于这里取r < n的情况),而前面的方法在秩亏的时候都会失效。
问题: objc在向一个对象发送消息时, 发生了什么?1.根据对象的isa指针找到类对象id, 在查询类对象里面的methodLists方法函数列表2.如果没有在好到, 在沿着superClass, 寻找父类,再在父类methodLists方法列表里面查询3.最终找到SEL, 根据id和SEL确认IMP(指针函数), 在发送消息.问题: 什么时候会报unrecognized selector错误?
细说python接口测试框架requests-郭宏志-视频专栏你将收获学习使用requests库进行基本接口测试学习使用requests库进行高级接口测试学习requests集成pytest测试框架requests库源码分析适用人群测试人员、测试开发人员、python开发人员课程介绍1、本人目前在从事测试开发工作,本课程来自于实际工作经验总结。2、课程全面、细致,对零基础童鞋和有一定经验的童鞋,都有学习价值。3、课程全程手写代码,跟着老师学习一遍,你一定收获多多。4、课程没有废话,纯
上午遇见ogg数据同步不及时问题,查看抽取投递应用三进程状态正常,但是投递进程Lag at Chkpt(时间延迟)较大再比对查看抽取和投递进程的日志(均正常抽取投递),但抽取文件号到了7400多,但投递刚过7300,相差一百多队列文件没有投递再在目标端的dirdat查看,队列文件每半个小时才接收到一个,确定是pump进程投递投递过慢,文件出现延迟(但查看网络应该是正常的,不是网络IO问题)...
PermissionError: [WinError 5] 拒绝访问。: 'c:\\programdata\\anaconda3\\lib\\site-packages\\pip-18.0.dist-info\\entry_points.txt'
Win跟换了用户登陆使用cywin报告如下错误:cygwin提示自己所在的组变成了”mkpaswd”, 这说明/etc/passwd或者/etc/group需要重建了。Your group is currently "mkgroup". This indicates that neitheryour gid nor your pgsid (primary group associ
OC 运行时机制的一些应用
刚刚看完《银翼杀手》这一部经典的电影,很多人已经从剧情这方面给予了点评,本文尝试从画面布局去欣赏这一步难得的作品。
本文将就ViewStub的优缺点及使用方法展开分析。如有错误欢迎批评指正,共同交流,共同进步。如果本篇文章对你有一点帮助,欢迎点赞。一、ViewStup是什么? ViewStup是一个轻量级的view,之所以说它是轻量级的view是因为它在页面加载渲染的过程中不会去绘制,只是在你需要的时候再去绘制。二、viewStup的使用场景 只有在特定条件下才展示的布局,初始...
0. 目录1..... 问题描述2..... 初始解法—解法12.1 三者互素的判断3..... 改进解法—解法24..... 改进解法—解法35..... 改进解法—解法46..... 测试结果1. 问题描述本题来自《程序员的算法趣题》中的第16题。假设分别将3根长度相同的绳子摆成3个四边形。其中2根摆成...
云端服务器基于大规模分布式计算系统,该系统通过虚拟化技术集成IT资源,为各个行业提供互联网基础设施服务。亿人互联云服务器比传统服务器有许多优势。要了解中国云服务器品牌的状况,您可以看到哪个云服务器是好的。1.支持移动实时监控云服务器和独立服务器都支持远程监控和管理。但是,云服务器可以支持移动管理的使用,而独立服务器目前缺少移动管理,这需要手动手动管理资源和硬件。2.业务上线更快捷,更方便由于传统服...
pymysql是oython连接mysql数据库进行操作的一个库,pymysql的详细介绍如下文:https://www.cnblogs.com/wt11/p/6141225.htmlimport pymysql# 连接数据库# 应提供主机名 端口号 用户名 密码 以及数据库名connect = pymysql.Connect(host='localhost',port=3306...
更新一波瞎折腾系列,这次瞎折腾断断续续耗费了两天半,在Linux(openSUSE)系统上使用虚拟机virtualbox安装Windows(Windows10)系统。Linux下开虚拟机流畅度好的不是一点半点,极度顺滑,跟直接安装系统流畅度基本没区别,然而之前在Windows下虚拟机安装Linux就会出现很严重的卡顿现象。开虚拟机系统CPU占用特别高Linux对独立显卡几乎没有支持虚拟机安装W