概览

矩阵求逆是线性代数中的核心运算之一。给定一个 可逆矩阵 ,其逆矩阵 满足 。本节介绍基于 LUP 分解 的高斯-约当消元法来计算逆矩阵,其核心思想是将增广矩阵 通过行变换转化为 。该算法的时间复杂度为 ,与 矩阵乘法 的标准算法同阶。本节还将证明矩阵乘法与矩阵求逆在计算复杂度上的等价关系:如果能以 的时间完成其中之一,则另一个也可以在同样的时间界内完成。


知识结构总览

flowchart TD
    A["矩阵求逆问题"] --> B{"矩阵是否可逆?"}
    B -->|"det(A) ≠ 0 且满秩"| C["高斯-约当消元法"]
    B -->|"det(A) = 0 或不满秩"| D["矩阵不可逆,无逆矩阵"]
    C --> E["构造增广矩阵 [A | I]"]
    E --> F["对增广矩阵执行行变换"]
    F --> G["将 A 部分化为单位阵 I"]
    G --> H{"变换是否成功?"}
    H -->|"成功"| I["右侧即为逆矩阵 A⁻¹"]
    H -->|"出现全零行"| J["矩阵不可逆"]
    I --> K["验证:A × A⁻¹ = I"]
    K --> L["验证通过,求逆完成"]

    style A fill:#e1f5fe
    style I fill:#c8e6c9
    style J fill:#ffcdd2
    style L fill:#c8e6c9

前置依赖28.1 求解线性方程组(LUP 分解)、4.1 矩阵乘法(矩阵乘法基础)


核心思想

2.1 矩阵可逆的充要条件

对于 矩阵 ,以下条件相互等价,任一成立即可推出 可逆:

  1. 行列式条件
  2. 满秩条件(即 的行向量组和列向量组均线性无关)
  3. LU 分解条件 存在不带行交换的 LU 分解 ,且 的对角元素均非零
  4. 线性方程组条件:对任意 维向量 ,方程组 都有唯一解
  5. 零空间条件 的零空间仅含零向量,即 只有平凡解

生活化类比

想象矩阵 是一台”变换机器”,它将输入向量 变换为输出向量 。如果 可逆,意味着存在一台”逆变换机器” ,能将 完美还原为 。如果 不可逆(比如将三维空间压缩到二维平面),那信息已经丢失,无法还原——就像把一张揉皱的纸完全展平恢复原样一样不可能。

2.2 高斯-约当消元法求逆的核心思想

高斯-约当消元法是计算逆矩阵最直观的方法。其核心策略如下:

基本原理:若对矩阵 施加一系列初等行变换将其化为单位阵 ,则对单位阵 施加完全相同的初等行变换,所得结果即为

操作方式:构造 的增广矩阵 ,对该增广矩阵执行行变换,目标是把左半部分化为 。变换完成后,右半部分自然成为

三种初等行变换

  • 行交换:交换第 行与第
  • 行缩放:将第 行乘以非零常数
  • 行消元:将第 行的 倍加到第 行上

算法执行流程

flowchart TD
    S["开始:输入 n×n 矩阵 A"] --> E["构造增广矩阵 B = [A | I]"]
    E --> L["令 k = 1"]
    L --> P{"k ≤ n?"}
    P -->|"是"| F["寻找主元:在第 k 列中找到第 k 行及以下的非零元素"]
    F --> Z{"找到非零主元?"}
    Z -->|"否"| ERR["矩阵不可逆,终止"]
    Z -->|"是"| SW["若主元不在第 k 行,交换行使主元位于对角线"]
    SW --> SC["将第 k 行除以主元值,使 B[k][k] = 1"]
    SC --> EL["对每一行 i ≠ k:将第 k 行乘以 -B[i][k] 加到第 i 行"]
    EL --> INC["k = k + 1"]
    INC --> P
    P -->|"否"| R["提取右半部分作为 A⁻¹"]
    R --> V["验证 A × A⁻¹ = I"]
    V --> END["结束"]

    style S fill:#e1f5fe
    style END fill:#c8e6c9
    style ERR fill:#ffcdd2

2.3 伪代码

INVERT-MATRIX(A, n)
1  构造 n×2n 增广矩阵 B ← [A | Iₙ]
2  for k ← 1 to n do
3      // 选主元
4      pivot ← k
5      for i ← k+1 to n do
6          if |B[i][k]| > |B[pivot][k]| then
7              pivot ← i
8      if B[pivot][k] = 0 then
9          error "矩阵不可逆"
10     if pivot ≠ k then
11         交换 B 的第 k 行与第 pivot 行
12     // 归一化第 k 行
13     temp ← B[k][k]
14     for j ← k to 2n do
15         B[k][j] ← B[k][j] / temp
16     // 消去第 k 列的其他元素
17     for i ← 1 to n do
18         if i ≠ k then
19             factor ← B[i][k]
20             for j ← k to 2n do
21                 B[i][j] ← B[i][j] - factor × B[k][j]
22  // 提取逆矩阵
23  创建 n×n 矩阵 A⁻¹
24  for i ← 1 to n do
25      for j ← 1 to n do
26          A⁻¹[i][j] ← B[i][j + n]
27  return A⁻¹

伪代码要点说明

  • 第 4-7 行执行部分主元选取(partial pivoting),选取绝对值最大的元素作为主元以提高数值稳定性
  • 第 12-15 行将主元所在行归一化,使对角线元素变为 1
  • 第 17-21 行对所有其他行执行消元操作(包括主元上方的行),这正是高斯-约当法区别于普通高斯消元法的关键——普通高斯消元只消去下三角部分,而高斯-约当消元同时消去上三角部分

2.4 计算复杂度分析

时间复杂度

逐层分析:

  • 第 2 层循环 从 1 到 ):共执行
  • 归一化步骤(第 14-15 行):第 次迭代处理 个元素,共 次运算
  • 消元步骤(第 17-21 行):第 次迭代对 行执行消元,每行处理 个元素,共 次运算

因此总时间复杂度为 ,与标准 矩阵乘法 算法相同。

空间复杂度,增广矩阵占用 的空间。

2.5 矩阵乘法与矩阵求逆的关系定理

这是本节最重要的理论结果之一。

定理 28.2(矩阵乘法与矩阵求逆的等价性)

如果能在 时间内计算两个 矩阵的乘积,则也能在 时间内求出 可逆矩阵的逆。反之,如果能在 时间内求逆,则也能在 时间内完成矩阵乘法。

证明方向一:从乘法到求逆

假设存在 的矩阵乘法算法 。给定可逆矩阵 ,需要计算

  1. 首先计算 的 LUP 分解,得到 ,可在 时间内完成
  2. 利用 的三角结构,通过前代和回代分别求出
  3. 利用乘法算法 计算

关键在于: 的计算可以利用三角矩阵的特殊结构,将问题转化为一系列小规模乘法,最终通过递归应用 的乘法算法实现整体 的求逆。

证明方向二:从求逆到乘法

假设存在 的矩阵求逆算法 。给定矩阵 ,需要计算

构造分块矩阵:

再构造:

计算乘积:

因此,只需对 矩阵求逆,即可从结果中提取出 。由于求逆算法为 ,对 矩阵求逆的时间为 ,从而矩阵乘法也可在 时间内完成。

推论

由于 Strassen算法 能在 时间内完成矩阵乘法,因此矩阵求逆也可以在 时间内完成。矩阵乘法与矩阵求逆在计算复杂度上具有相同的渐进难度

2.6 具体数值示例:3×3 矩阵求逆

给定矩阵:

第一步:构造增广矩阵

第二步:第 1 列消元

选取主元 ,归一化第 1 行(第 1 行除以 2):

消去第 2 行的第 1 列元素(第 2 行减去 第 1 行):

消去第 3 行的第 1 列元素(第 3 行减去 第 1 行):

第三步:第 2 列消元

选取主元 ,归一化第 2 行(第 2 行乘以 2):

消去第 1 行的第 2 列元素(第 1 行减去 第 2 行):

消去第 3 行的第 2 列元素(第 3 行减去 第 2 行):

第四步:第 3 列消元

选取主元 ,归一化第 3 行(第 3 行除以 ):

消去第 1 行的第 3 列元素(第 1 行加上 第 3 行):

消去第 2 行的第 3 列元素(第 2 行减去 第 3 行):

第五步:提取逆矩阵

验证

2.7 正确性证明

定理:若矩阵 可逆,则高斯-约当消元法能正确计算出

证明

初等行变换的矩阵表示(每个初等行变换等价于左乘一个初等矩阵)】 设 是执行过程中依次施加的 个初等行变换对应的初等矩阵。每个初等矩阵都是可逆的(行交换的逆是自身,行缩放 的逆是缩放 ,行消元 的逆是 )。

变换过程的矩阵方程(增广矩阵的变换等价于对两侧同时左乘初等矩阵)】 对增广矩阵 施加全部 个初等行变换,等价于:

逆矩阵的存在性 可逆保证消元过程不会出现全零行)】 由于 可逆,,初等行变换不改变行列式的非零性(仅改变符号或缩放),因此在每一步中当前子矩阵的行列式均不为零,主元位置不会出现全零列。这保证了算法不会在第 8-9 行报错。

最终结果的正确性(右侧矩阵即为 )】 由上式可得 ,因此:

而右侧部分为 ,恰好是所求的逆矩阵。

唯一性(可逆矩阵的逆是唯一的)】 假设 都是 的逆矩阵,则 ,于是 ,故逆矩阵唯一。


补充理解与拓展

高斯-约当消元法的历史与 Gauss 的贡献

消元法的思想可以追溯到中国古代的《九章算术》(约公元前 1 世纪),其中”方程术”本质上就是高斯消元法。在西方,该方法直到 19 世纪才被重新发现。Carl Friedrich Gauss(1777-1855)在解决天体力学中的最小二乘问题时系统地使用了消元法,但 Gauss 本人并未将其写成完整的算法论文。

Wilhelm Jordan(1842-1899)是一位德国测绘工程师,他在 1888 年出版的著作《Handbuch der Vermessungskunde》(测绘学手册)中详细描述了如何高效地使用消元法,并引入了简洁的符号系统。值得注意的是,与微积分中的 Camille Jordan 不同,这位 Jordan 的贡献在于将消元法推广为全主元消元形式(即同时消去对角线上方和下方的元素),使其成为求逆矩阵的标准工具。几乎在同一时期(1888 年),法国数学家 B.-I. Clasen 也独立发表了类似的方法。

分块矩阵求逆(Block Matrix Inversion)

对于分块矩阵,可以利用 Schur 补(Schur Complement)来分块求逆。设 矩阵 分块为:

其中 矩阵, 矩阵。若 可逆,则 Schur 补定义为 。当 均可逆时:

类似地,若 可逆,则 的 Schur 补为 ,当 均可逆时也有对称形式的公式。分块求逆公式在 Strassen算法 的矩阵求逆变体中扮演关键角色——Strassen 正是通过递归地应用分块求逆来实现 的求逆复杂度。

Strassen 矩阵求逆

在 Strassen 于 1969 年发表矩阵乘法算法的同一篇论文中,他还提出了一个利用分块策略在 时间内求逆的算法。设 分块为 子矩阵, 同样分块为

  1. 递归计算
  2. 计算
  3. 计算
  4. 计算
  5. 计算 (即 Schur 补的负值)
  6. 递归计算
  7. 计算

该算法包含 2 次递归求逆(步骤 1 和 6,规模为 )和若干次矩阵乘法/加法,其递推关系为 ,解得

数值稳定性:为什么实践中不直接计算逆矩阵

在数值计算实践中,“不要显式求逆”是一条重要准则。主要原因如下:

计算代价:通过 LU 分解直接求解 需要约 次浮点运算,而先计算 再做矩阵乘法 需要约 次运算——代价约为直接求解的 3 倍

数值精度:根据 Higham(2002)《Accuracy and Stability of Numerical Algorithms》第 14 章的分析,即使精确计算了 ,用 求解的向后误差界中包含 项,而直接用 LU 分解求解的向后误差界中只包含 项。当矩阵病态(condition number 很大)时,求逆法的误差可能显著劣于直接求解法。

稀疏性破坏:即使 是稀疏矩阵, 通常也是稠密的,显式存储逆矩阵会带来巨大的内存开销。

当然,Druinsky 和 Toledo(2012)的研究表明,对于良态问题,求逆法的前向误差与直接求解法差距不大。但在一般情况下,直接求解始终是更安全的选择。


易混淆点

矩阵求逆 vs 解线性方程组

混淆点:认为求解 必须先计算 ,然后

澄清:在绝大多数实际场景中,应该使用 LUP 分解 直接求解方程组,而非先求逆再乘以 。原因有三:(1) 计算代价约为 3 倍;(2) 数值精度更差;(3) 破坏稀疏性。

何时应该求逆:只有当你需要反复使用同一个 来求解大量不同的 (即 ),且 足够大时,预先计算 才可能在效率上有优势。即便如此,实践中更推荐预先计算 LU 分解而非显式逆矩阵。

左逆 vs 右逆:

混淆点:认为 就足以说明

澄清:对于方阵而言, 是等价的——如果 ,则自动有 (反之亦然),因此方阵的左逆等于右逆,逆矩阵唯一。

但对于非方阵,情况不同。若 矩阵():

  • 左逆:若 ),则 的左逆,要求 列满秩(
  • 右逆:若 ),则 的右逆,要求 行满秩(

仅当 可逆时,左逆和右逆才同时存在且相等。

数值求逆的精度问题

混淆点:认为只要矩阵理论上可逆,计算机就一定能精确求出逆矩阵。

澄清:当矩阵的条件数 很大时(病态矩阵),求逆结果的有效数字位数会严重损失。例如,若 ,使用双精度浮点数(约 16 位有效数字)求逆,结果可能只剩约 8 位有效数字。更严重的情况是,如果 接近或超过 ,求逆结果可能完全不可靠。

实用建议:在求逆之前,先检查条件数。若 过大,应考虑使用正则化方法(如 Tikhonov 正则化)或奇异值分解(SVD)来获得稳定的近似解。


习题精选

题号题目内容核心考点难度
28.2-1手动计算给定矩阵的逆高斯-约当消元法完整执行
28.2-2利用 LUP 分解求逆LUP 分解与求逆的关系
28.2-4矩阵乘法与求逆的关系定理 28.2 的构造性证明
28.2-6广义逆矩阵Moore-Penrose 伪逆

视频学习指南

资源讲者/来源主题时长链接
MIT 18.06 Lecture 34Gilbert Strang矩阵求逆与 LU 分解45 minMIT OCW
3Blue1BrownGrant Sanderson逆矩阵与列空间10 minYouTube
Khan AcademySal KhanGauss-Jordan 消元法15 minKhan Academy
CLRS 课程各大学公开课第 28 章矩阵运算--

教材原文

CLRS 第 4 版第 28.2 节

We now investigate how to compute the inverse of a matrix. We start by showing how to use LUP decomposition to compute the inverse, and then we show how to invert matrices using Gauss-Jordan elimination.

Inverting an matrix can be done in time. As we shall see, the problem of inverting matrices has an interesting relationship to the problem of multiplying matrices.


参见Wiki


第28章-矩阵运算 矩阵求逆