视觉SLAM中的数学——解方程AX=b与矩阵分解:奇异值分解(SVD分解) 特征值分解 QR分解 三角分解 LLT分解

2023-05-16

前言

本博客主要介绍在SLAM问题中常常出现的一些线性代数相关的知识,重点是如何采用矩阵分解的方法,求解线性方程组AX=B。主要参考了《计算机视觉——算法与应用》附录A以及Eigen库的方法。本博客可能不会对分解讲的特别深入,主要是想弄清楚各个分解的条件、分解结果以及应用(或特点)。

包括:
1、三角分解(LU分解)
2、LDLT分解与LLT分解(Cholesky分解)
3、QR分解
4、奇异值分解(SVD分解)
5、特征值分解

在矩阵分解之前

为什么要进行矩阵分解

1、矩阵分解可以在一定程度上降低存储空间,可以大大减少问题处理的计算量(如对一个矩阵进行求逆、求解方程组等),从而高效地解决目标问题。
2、矩阵分解可以提高算法的数值稳定性。

矩阵与矩阵分解的几何意义

在矩阵分解中,我们常常期望将矩阵分解成正交矩阵、对角矩阵以及上三角(下三角)矩阵的乘积。以三维矩阵为例,一个普通矩阵的几何意义是对坐标进行某种线性变换,而正交矩阵的几何意义是坐标的旋转,对角矩阵的几何意义是坐标的缩放,三角矩阵的几何意义是对坐标的切边。因此对矩阵分解的几何意义就是将这种变换分解成缩放、切边和旋转的过程。

常用矩阵分解

LU三角分解

三角分解又称为LU分解或LR分解,是将原正方(square)矩阵分解成一个上三角矩阵和一个下三角矩阵

A = L D U = L ( D U ) = ( L D ) U A = LDU = L(DU) = (LD)U A=LDU=L(DU)=(LD)U

其中L是单位下三角矩阵,D是对角矩阵,U是单位上三角矩阵。

三角分解的主要用途在于简化一个大矩阵行列式值计算过程,或求解方程组(即高斯消元法)等。

LDLT分解

为A为对称矩阵,且任意一K阶主子阵均不为0时,A有如下唯一的分解形式:
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 ) A = LDL^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=1L21L3101L32001D1000D2000D3100L2110L31L321

即L为下三角单位矩阵,D为对角矩阵。LDLT方法实际上是Cholesky分解法的改进(LLT分解需要开平方),用于求解线性方程组。

LLT分解(Cholesky分解)

LLT分解即矩阵的Cholesky分解,又被称为平方根分解,是LDLT分解的一种特殊形式,即其中的D为单位矩阵。
对称正定矩阵A可以分解成一个下三角矩阵L和L的转置LT相乘的形式:

A = L L T = R T R A = LL^T = R^T R A=LLT=RTR

其中的L是下三角矩阵,R是上三角矩阵。
(正定要求矩阵的所有特征值必须大于0,因此分解的下三角对角元也是大于0的)

LLT分解常用于求解最小二乘问题中的 A T A x = A T b A^TAx = A^Tb ATAx=ATb
C = A T A = R R C=A^TA=R^R C=ATA=RR,又有 d = A T b d=A^Tb d=ATb,
因子经过因子分解后,x可以通过解下面的方程获得,即只需求解两个三角系统,通过一系列前向和后向迭代运算。

R T z = d , R x = z R^Tz= d,Rx=z RTz=d,Rx=z

LLT分解的总操作数为 O ( N 2 ) O(N^2) O(N2),对于系数矩阵来说操作数会大大降低。

QR分解

如果A是mxn实(复)矩阵,且其n个列线性无关,则A有分解:
A = Q R A=QR A=QR

其中Q是正交矩阵(或酉矩阵) Q Q T = 1 QQ^T =1 QQT=1,R是上三角矩阵

QR分解有三种常用方法:Givens 变换、Householder 变换,以及 Gram-Schmidt正交化。

QR分解是一项广泛用于稳定求解病态最小二乘问题的方法,也是一些更复杂算法的矩阵,如计算SVD及特征值分解。在计算机视觉中,QR分解可以用于将相机矩阵转换为一个旋转矩阵和一个上三角的标定矩阵。

奇异值分解

设A是一个mxn的矩阵,则存在一个分解的m阶正交矩阵U、非负对角阵Σ和n阶正交矩阵V:
A = U D V T = U [ Σ 0 0 0 ] V T A=U D V^{\mathrm{T}}=U\left[\begin{array}{cc}{\Sigma} & {0} \\ {0} & {0}\end{array}\right] V^{\mathrm{T}} A=UDVT=U[Σ000]VT

其中 Σ = d i a g ( σ 1 , σ 2 , . . . , σ r ) Σ=diag(\sigma_1,\sigma_2,...,\sigma_r) Σ=diag(σ1,σ2,...,σr) σ \sigma σ为矩阵A的全部非零奇异值,且一般我们会将Σ的值从大到小排序。奇异值分解的一个重要性质是:在实际大多数情况中,奇异值 σ \sigma σ减小的速度特别快,因此可以使用前r个奇异值来对矩阵做近似(即丢弃U和V的后几列),将获得原始矩阵A在最小二乘意义下的最佳逼近。

矩阵的奇异值分解通常是不唯一的。

SVD分解在最优化问题、特征值问题、最小二乘问题(尤其是亏秩最小二乘问题)等具有巨大的作用。

SVD分解的几何意义可以通过公式的重写获得:
A V = U Σ 或 A v j = σ j u j AV = UΣ 或 Av_j = \sigma_j u_j AV=UΣAvj=σjuj

即当矩阵A作用于任何基向量 v j v_j vj时,会把 v j v_j vj变换到 u j u_j uj的方向,同时将 u j u_j uj的长度变成 σ j \sigma_j σj。也可以看成先旋转然后缩放再旋转的过程。

特征值分解

如果A是一个NxN的方阵,且有N个线性无关的特征向量,则可以被写成特征值分解的形式:
A = U Λ U T A=UΛU^T A=UΛUT

其中Q为NxN方阵,且第i列为A的特征向量,Λ为对角矩阵,其对角线上的元素为对应的特征值。注意只有可对角化矩阵才能作特征值分解。

特征值分解可用于求解矩阵的逆:
A − 1 = U Λ − 1 U T A^{-1}=UΛ^{-1}U^T A1=UΛ1UT

在数据统计分析中常常出现A为半正定矩阵,其表示数据点的协方差,此时特征值分解就是通常所说的主分量分析(PCA),因为它完成了对数据点分布在其中心周围变化的主方向和幅度的建模。

在求解最小二乘问题时,常常通过一系列外积之和构造对称矩阵C,此时C也是半正定的:
C = ∑ i a i a i T = A A T C=\sum_i {a_ia_i^T} = AA^T C=iaiaiT=AAT

此时C的特征值和特征向量与A的奇异值和奇异向量:
A = U D V T A=U D V^T A=UDVT

C = A A T = U D V T V D T U T = U Λ U T C = AA^T = U D V^T V D^T U^T=UΛU^T C=AAT=UDVTVDTUT=UΛUT

由此我们可以得到特征值 λ i = σ i 2 \lambda_i = \sigma_i^2 λi=σi2

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

视觉SLAM中的数学——解方程AX=b与矩阵分解:奇异值分解(SVD分解) 特征值分解 QR分解 三角分解 LLT分解 的相关文章

  • 成功解决VSCODE运行C++的报错问题g++

    成功解决VSCODE运行C 43 43 的报错问题g 43 43 解决方案调试 很久写C 43 43 了 xff0c 直接打开C 43 43 写代码测试一下 xff0c 报错 xff0c 真一脸懵逼 捯饬很久 xff0c 解决了问题 解决方
  • linux下的环境变量

    环境变量 环境变量 xff0c 是指在操作系统中用来指定操作系统运行环境的一些参数 通常具备以下特征 xff1a 字符串 本质 有统一的格式 xff1a 名 61 值 值 值用来描述进程环境信息 存储形式 xff1a 与命令行参数类似 ch
  • 【004 关键字】extern “C“的作用是什么?

    一 extern 34 C 34 的作用 extern 34 C 34 关键字常用于C 43 43 和C混合编程中 xff0c 用于指定函数或变量采用C语言的命名和调用约定 加上extern 34 C 34 后 xff0c 会指示编译器这部
  • C++模板编程--学习C++类库的编程基础

    目录 一 函数模板二 类模板三 实现C 43 43 STL向量容器vector代码四 理解容器空间配置器allocator的重要性 一 函数模板 1 模板的意义 xff1a 对类型也可以进行参数化了 2 函数模板 lt 61 是不进行编译的
  • cmake 学习使用笔记(二)库的生成与使用

    学习使用cmake 生成及使用库 xff0c 使用cmake 生成 lib 静态库 及动态库 xff08 dll xff09 及linux 下使用的静态库 a 和 动态库 xff08 so 也称为共享库 xff09 目录 使用工具 生成库
  • cmake 学习使用笔记(五)手动编译

    目录 编译cmake 项目 构建 方式一 xff1a 可执行文件生成的在当前目录 方式二 xff1a 可执行文件生成只制定目录 记录一下手动编译 cmake 项目 编译cmake 项目 项目结构 注意 xff1a 必须要有一个 CMakeL
  • 四旋翼无人机学习第5节--STM32最小系统外围电路分析

    文章目录 1 芯片手册分析2 stm32的外部晶振手册分析2 stm32的外部上电复位手册分析3 电源放置方法4 GND放置方法5 其他元器件放置方法6 网络放置方法7 快捷键分享8 原理图绘制成果分享 快速使用芯片的最好的方式 xff0c
  • 现代C++单文件库(header only)

    nlohmann json https github com nlohmann json easyloggingpp https github com amrayn easyloggingpp
  • 一、ROS创建工作空间

    一 ROS创建工作空间 1 什么是工作空间2 创建工作空间3 编译工作空间4 创建功能包5 编译功能包 xff08 重新编译工作空间 xff09 6 设置环境变量7 运行节点 1 什么是工作空间 工作空间 xff08 workspace x
  • 二、ROS集成开发环境

    二 ROS集成开发环境 1 安装terminator2 安装VScode3 在VScode中使用ROS3 1 创建工作空间3 2 启动VScode3 3 配置VScode3 4 创建功能包3 5 编写C 43 43 文件3 6 配置CMak
  • 十一、Ubuntu18.04下VSCode配置C/C++编译环境

    十一 Ubuntu18 04下VSCode配置C C 43 43 编译环境 1 安装VSCode2 安装插件3 创建工程4 总结 1 安装VSCode 这一步就不谈了 2 安装插件 编译一些简单的cpp文件 xff0c 下面几个插件就够用了
  • 十五、Typora官方主题 + 自定义主题

    十五 Typora官方主题 43 自定义主题 1 下载官方主题2 在官方主题的基础上自定义 1 下载官方主题 首先去Typora官网下载自己喜欢的主题 xff1a 官方主题下载 例如我这里选择 Vue 我们只用到里面的两个主题文件vue c
  • linux---进程控制

    进程控制 fork函数 创建一个子进程 pid t fork void 失败返回 1 xff1b 成功返回 xff1a 父进程返回子进程的ID 非负 子进程返回 0 pid t vfork void 同样时创建一个子进程 xff0c 但是他
  • 十六、windows11下VSCode配置C/C++编译环境

    十六 windows11下VSCode配置C C 43 43 编译环境 1 安装VSCode2 中文插件3 MinGW编译器下载和配置4 VSCode配置c c 43 43 编译环境5 测试是否配置成功6 使用万能头文件 include l
  • 十七、WSL2的安装与使用(Win11)

    十七 WSL2的安装与使用 xff08 Win11 xff09 1 准备工作1 1 开启主板 BIOS 虚拟化1 2 检查是否成功开启虚拟化1 3 开启开发者模式1 4 开启所需Windows功能1 5 下载 WSL 内核升级包 2 开始安
  • 十八、Ubuntu20.04 + VSCode + Opencv3.4.16 配置 + WSL2 可视化

    十八 Ubuntu20 04 43 VSCode 43 Opencv3 4 16 配置 43 WSL2 可视化 1 下载和解压 OpenCV3 4 162 使用 cmake 编译 OpenCV3 配置环境4 代码测试4 1 录制视频4 2
  • IntelRealSense 更新D435固件时,运行rs-fw-update -l后报错:找不到命令

    环境 xff1a Ubantu18 04 摄像头 xff1a IntelRealsense D435 首先确定电脑里已经成功安装了 librealsense 想要更新下D435的固件 xff0c 但是运行rs fw update l后报错
  • Linux _ Shell编程 — 变量

    一 shell脚本的基础知识 1 shell脚本的本质 语言的分类有 xff1a 编译性语言 C语言 C 43 43 语言 JAVA PHP Python等 xff0c 不同编译器编译的执行文件不同 xff0c 运行的平台也不尽相同 解释性
  • USART _ 两串口同时使用,冲突问题

    1 使用外设情况 xff1a 1 初始化了两个串口 xff1a 串口1以及串口2 xff0c 使用串口2DMA发送数据 xff0c 接收中断 接收数据 xff1b 使用串口1发送函数发送数据 xff0c 接收中断接收数据 xff1b 2 问
  • C语言 _ MakeFile(一)

    一 Make简介 工程管理器 xff0c 顾名思义 xff0c 是指管理较多的文件 Make工程管理器也就是个 自动编译管理器 xff0c 这里的 34 自动 34 是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量 xff0c

随机推荐