附录 A 线性代数与数值技巧 (Linear Algebra and Numerical Techniques)

      +

      核心结论

      • 矩阵分解:LU 分解 / QR 分解 / SVD / Cholesky;不同分解适合不同问题。

      • 线性系统求解:直接法(高斯消元)/ 迭代法(共轭梯度);病态系统需正则化。

      • 特征值与奇异值:SVD 用于 PCA / 矩阵伪逆;特征值用于谱分析。

      • 非线性最小二乘:Gauss-Newton / Levenberg-Marquardt;曲线拟合 / 相机标定。

      • 稀疏矩阵求解:稀疏 Cholesky / 共轭梯度;大尺度 SfM / SLAM 后端。

      本章主旨

      附录 A 是 CV 数值计算的数学基础——把第 4 章的线性代数 / 优化公式具象化为"工具"。理解后才能看懂 OpenCV / Ceres / g2o 等库的内部实现。

      一、核心概念

      本章围绕 5 个核心概念展开:矩阵分解 → 线性系统 → 特征值 → 非线性最小二乘 → 稀疏求解。

      概念 定义 + 重要性 实现提示

      矩阵分解

      LU / QR / SVD / Cholesky;不同分解适合不同问题。

      A.1;CV 算法的基础工具。

      线性系统求解

      直接法(高斯消元)/ 迭代法(CG);病态系统需正则化。

      A.2;SfM / SLAM 后端常用。

      特征值与奇异值

      SVD 用于 PCA / 矩阵伪逆;特征值用于谱聚类 / Hessian 分析。

      A.3;很多 CV 算法基于谱方法。

      非线性最小二乘

      Gauss-Newton / Levenberg-Marquardt;曲线拟合 / 相机标定。

      A.4;几乎所有 CV 优化都用。

      稀疏矩阵求解

      稀疏 Cholesky / 共轭梯度;大尺度 SfM / SLAM 后端。

      A.5;几千相机 + 百万点也能高效求解。

      二、详细笔记

      2.1 矩阵分解 (Matrix Decomposition)

      What:把矩阵分解为更简单的形式,便于求解 / 分析。

      Why:CV 算法几乎都用矩阵分解(SfM 后端 / 优化 / 特征提取)。

      How

      常见分解:

      • LU 分解A = LU;解 Ax = bLy = b, Ux = y

      • QR 分解A = QR(Q 正交);最小二乘首选。

      • SVDA = U Σ Vᵀ;秩 / 伪逆 / PCA。

      • CholeskyA = LLᵀ(A 正定);高效。

      矩阵分解选择
      • LU:通用方阵;解线性系统。

      • QR:最小二乘 / 特征值(QR 算法)。

      • SVD:矩阵分析 / 伪逆 / 降维。

      • Cholesky:正定矩阵(如 Hessian / 协方差)。

      When:所有 CV 算法的数学基础。

      Example*:np.linalg.solve(A, b)np.linalg.lstsq(A, b)scipy.linalg.cholesky

      2.2 线性系统求解 (Linear System Solving)

      What:求解 Ax = b;A 是 n×n 矩阵。

      Why:CV 中很多问题(相机标定 / SfM / 立体匹配)都归结为线性系统。

      How

      求解方法:

      • 直接法:高斯消元 / LU 分解;O(n³);精度高。

      • 迭代法:共轭梯度(CG);O(n² · iter);适合大稀疏。

      • 正则化:Tikhonov ||Ax - b||² + λ||x||²;防过拟合 / 病态。

      病态系统的诊断
      • 条件数 cond(A) = σ_max / σ_min;越大越病态。

      • 高条件数 → 解对噪声敏感。

      • 正则化(Tikhonov / L1)稳定求解。

      When:SfM BA(直接法);稀疏 SLAM 后端(CG);深度学习(线性层反向传播)。

      Example*:np.linalg.solvescipy.sparse.linalg.cgg2o / Ceres 用稀疏 Cholesky + CG。

      2.3 特征值与奇异值 (Eigenvalues & SVD)

      WhatAv = λv(特征值);A = U Σ Vᵀ(SVD)。

      Why:SVD 是矩阵分析的"瑞士军刀"——PCA / 伪逆 / 秩 / 谱方法都基于它。

      How

      SVD 应用:

      • PCAX = U Σ Vᵀ;主成分 = V[:, :k]

      • 伪逆A⁺ = V Σ⁺ Uᵀ;解最小二乘。

      • 低秩近似X ≈ U[:, :k] Σ[:k, :k] V[:, :k]ᵀ

      SVD 的几何意义
      • U:列是 A 的"输出基"(图像空间)。

      • Σ:对角元素 = 奇异值 = 各方向"伸缩量"。

      • Vᵀ:行是 A 的"输入基"(输入空间)。

      • 低秩 → 几个大奇异值 → 矩阵"几乎是"几个方向的拉伸。

      When:PCA / 特征降维;矩阵伪逆;谱聚类;低秩矩阵恢复。

      Example*:np.linalg.svdsklearn.decomposition.PCAcv2.SVD

      2.4 非线性最小二乘 (Nonlinear Least Squares)

      What:最小化 ||f(x)||²;f 是非线性函数。

      Why:CV 中曲线拟合 / 相机标定 / PnP / BA 都用。

      How

      求解算法:

      • Gauss-Newtonx ← x - (Jᵀ J)⁻¹ Jᵀ f(x)(J = Jacobian);快但需初始接近。

      • Levenberg-Marquardtx ← x - (Jᵀ J + λI)⁻¹ Jᵀ f(x);调节 λ 平衡收敛。

      LM vs Gauss-Newton
      • Gauss-Newton:快;二阶收敛;初始敏感。

      • LM:慢(每步解线性系统);鲁棒;初始不敏感。

      • 现代 CV 默认用 LM(Ceres / g2o / OpenCV solvePnP)。

      When:曲线 / 表面拟合;相机标定;SfM / SLAM 后端;BA 优化。

      Example*:scipy.optimize.least_squares(method='lm')Ceres / g2o;OpenCV cv2.solvePnP

      2.5 稀疏矩阵求解 (Sparse Matrix Solving)

      What:A 是稀疏矩阵(多数元素为 0)的 Ax = b 求解。

      Why:SfM / SLAM 中 BA 的 Hessian 矩阵是稀疏的;高效稀疏求解是实时性的关键。

      How

      稀疏求解:

      • 稀疏 Cholesky:利用稀疏模式分解;O(n^1.5) 而非 O(n³)。

      • 共轭梯度 (CG):迭代法;O(n · iter);无需分解。

      • 预条件子:加速 CG 收敛。

      SLAM 后端的稀疏性
      • BA Hessian 矩阵是 箭头形:相机 ↔ 观测点。

      • 利用稀疏结构 → 上千相机 + 百万点可在秒级求解。

      • g2o / Ceres / GTSAM 都用稀疏矩阵求解。

      When:SfM / SLAM 后端;SLAM 闭环;稀疏机器学习。

      Example*:g2o(通用图优化);Ceres(非线性最小二乘);GTSAM(因子图)。

      三、关键图表

      视觉图表

      图 A-1
      Figure 1. 图 A-1:SVD 几何意义
      图 A-2
      Figure 2. 图 A-2:Gauss-Newton 迭代

      非可视化条目

      非可视化条目(表 / 算法)
      编号 内容摘要

      表 A.1

      矩阵分解对比(LU / QR / SVD / Cholesky)。

      表 A.2

      非线性最小二乘算法对比(Gauss-Newton / LM)。

      式 A-1 至 A-12

      SVD / Cholesky / LM 公式。

      核心公式对照表

      核心公式对照表
      概念 公式

      SVD

      \(A = U \Sigma V^T, \quad A^+ = V \Sigma^+ U^T\)

      LM 迭代

      \(\mathbf{x} \leftarrow \mathbf{x} - (J^T J + \lambda I)^{-1} J^T \mathbf{f}(\mathbf{x})\)

      Gauss-Newton

      \(\mathbf{x} \leftarrow \mathbf{x} - (J^T J)^{-1} J^T \mathbf{f}(\mathbf{x})\)

      伪逆最小二乘

      \(\mathbf{x} = A^+ \mathbf{b} = (A^T A)^{-1} A^T \mathbf{b}\)

      四、思维导图

      mindmap
        root((附录 A 线性代数与数值技巧))
          矩阵分解
            LUQR
            SVD
            Cholesky
          线性系统
            直接法
            迭代法
            正则化
          特征值
            SVD分解
            PCA
            伪逆
          非线性LS
            GaussNewton
            LevenbergMarquardt
          稀疏求解
            Cholesky
            CG迭代
            预条件

      五、重点与易错点

      • 选对矩阵分解:LU 通用 / QR 最小二乘 / SVD 通用 / Cholesky 正定。

      • 病态系统需正则化:高条件数用 Tikhonov / L1。

      • LM 是非线性最小二乘默认:平衡速度 / 鲁棒性。

      • 稀疏 BA 用稀疏 Cholesky + CG:上千万变量也能实时求解。

      • SVD 是数值分析的"瑞士军刀":PCA / 伪逆 / 谱分析都基于它。

      • 跨章衔接:第 4 章优化用本附录 LM;第 8 章 BA 用本附录稀疏求解;第 11 章 SfM/SLAM 用本附录所有工具。