系列 · 线性代数 · 第 5 篇

线性代数(五):线性方程组与列空间

Ax = b 何时有解?有几个解?真正的答案是几何的:取决于 b 是否落在 A 的列空间里,也取决于 A 把多少输入维度压成了零。本章把高斯消元、列空间、零空间、秩与秩-零化度定理串成同一幅结构图。

一个贯穿始终的核心问题#

在应用数学中,几乎所有问题最终都会归结为同一个核心问题:

线性代数(五):线性方程组与列空间 — 章节概览图

给定矩阵 $A$ 和向量 $\vec{b}$ ,方程 $A\vec{x} = \vec{b}$ 是否有解?如果有,有多少个?

机械式的回答是“消元后看结果”,但结构性的回答才真正有趣——这也是本章的目标。三个几何对象足以揭示一切:

  • 列空间 $C(A)$ —— 矩阵 $A$ 能够到达的所有向量集合,它决定了方程是否有解
  • 零空间 $N(A)$ —— 被矩阵 $A$ 压缩为零的向量集合,它决定了有多少个解
  • $r$ —— 列空间的维度,量化了矩阵 $A$ 保留了多少信息。

一旦这三个概念清晰了,所有关于线性方程组的结论——存在性、唯一性、最小二乘法、四个基本子空间——都只是同一个故事从不同角度的讲述。

你将学到什么#

  • 两种互补视角理解 $A\vec{x}=\vec{b}$ :行视角(超平面相交)与列视角(列向量的线性组合);
  • 高斯消元作为操作工具,及其本质——LU 分解;
  • 列空间、零空间和秩的几何意义;
  • 秩-零化度定理与四个基本子空间;
  • 如何一眼看穿任意解集的结构。

先修知识#


$A\vec{x} = \vec{b}$ 的两种方式#

行视角:超平面的交点#

$$ \begin{cases} x + 2y = 5 \\ 3x - y = 1 \end{cases} $$

每个方程描述平面上的一条直线,解就是同时位于两条直线上的点——它们的交点 $(1, 2)$ 。在三维情形中,每个方程对应一个平面,解集则是这些平面的交集(可能是一个点、一条线、一个平面,或空集)。

这是大多数学生最先接触的图像:直观且具体,但它掩盖了真正关键的东西——矩阵本身的结构

列视角:向量的组合#

$$ x \begin{pmatrix} 1 \\ 3 \end{pmatrix} + y \begin{pmatrix} 2 \\ -1 \end{pmatrix} = \begin{pmatrix} 5 \\ 1 \end{pmatrix} $$

现在问题变成:能否用 $A$ 的列向量线性组合出 $\vec{b}$ 解方程就是在寻找合适的组合系数。

这一视角的转变是本章最重要的思想。由此出发,列空间、秩、解的存在性等概念自然浮现。

Ax = b 的几何意义:解的可能性取决于 b 是否在列空间里

上图展示了故事的两面。左边,列向量 $\vec{a}_1, \vec{a}_2$ 张成整个平面,因此任意目标 $\vec{b}$ 都可通过调整系数拼出——平行四边形恰好闭合到 $\vec{b}$右边,两列向量平行,列空间坍缩为一条直线;若 $\vec{b}$ 不在这条线上,则无法精确表示,此时最佳选择是将其正交投影到该线上——这正是最小二乘法的几何根源。

画家类比:你站在空白画布前,手握三管颜料(对应 $A$ 的三列)。列空间就是你能调出的所有颜色。若其中两管颜色相同,无论怎么混合,都无法得到新色调——你的可用色域比表面看起来更小。这种“看似丰富、实则冗余”的状态,正是秩亏矩阵的本质。


高斯消元:操作工具#

三种合法操作#

高斯消元通过仅使用三种初等行变换来简化方程组,且不改变其解集:

  1. 交换两行;
  2. 将某一行乘以非零常数;
  3. 将某一行的倍数加到另一行。

为何合法?因为每一步都是可逆的:任何操作序列都能被还原,因此前后解集完全一致。

一个完整例子#

$$ \begin{cases} x + 2y + z = 2 \\ 3x + 8y + z = 12 \\ 4y + z = 2 \end{cases} $$

写出增广矩阵,逐个主元向下消元。

高斯消元:将方程组化为阶梯形

每个高亮元素都是一个主元——该行首个非零元。当矩阵变为上三角后,进行回代

  • 第 3 行:$5z = -10 \implies z = -2$
  • 第 2 行:$2y - 2z = 6 \implies y = 7/2$
  • 第 1 行:$x + 2y + z = 2 \implies x = -11/2$

三列均有主元,意味着三个未知数受三个独立约束——解唯一。

主元与自由变量#

消元后,列分为两类:

  • 主元列:含主元的列,对应变量由其他变量决定;
  • 自由列:不含主元的列,对应变量可自由选取。

这一划分决定了全部解的结构:

情况解集
所有列均为主元列唯一解
存在自由列无穷多解(每组自由变量取值对应一个解)
出现 $0 = c \neq 0$ 的行无解

LU 分解:消元的存储形式#

$$ A = L \cdot U $$

其中 $U$ 是消元后的上三角矩阵,$L$ 的元素存储了消元过程中使用的乘子。LU 分解不过是高斯消元的封装:一旦获得 $L$$U$ ,对任意新 $\vec{b}$ 求解 $A\vec{x}=\vec{b}$ 仅需 $O(n^2)$ 时间,而非重新消元的 $O(n^3)$

LU 分解:A = L·U 等价于两次简单错切

从几何角度看,这幅图景令人愉悦。$A$ 或许复杂,但消元将其拆解为两个最简单的变换:先是一个上三角的剪切与缩放($U$ ),再是一个下三角的剪切($L$ )。三角矩阵之所以易于处理,是因为其作用具有因果性——每个输出坐标仅依赖于更早的输入——这正是回代法有效的根本原因。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import numpy as np

A = np.array([[1, 2, 1],
              [3, 8, 1],
              [0, 4, 1]], dtype=float)
b = np.array([2, 12, 2], dtype=float)

x = np.linalg.solve(A, b)
print(f"解: {x}")
print(f"验证 Ax = {A @ x}")

列空间:矩阵能“触及”的范围#

定义#

$$ C(A) = \{ A\vec{x} \mid \vec{x} \in \mathbb{R}^n \} = \text{span}\{ \text{columns of } A \} $$

两种等价解读:它是所有可能的输出,也是列向量的张成空间

存在性定理#

$A\vec{x} = \vec{b}$ 有解 当且仅当 $\vec{b} \in C(A)$

这是本章最简洁的陈述。“方程是否有解?”转化为“目标是否在列空间中?”——一个纯粹的几何问题。

列空间的形态#

列空间 = A 的列向量的张成

对于 $3 \times 3$ 矩阵,列空间位于 $\mathbb{R}^3$ 中,仅有三种可能:

列空间含义
1过原点的直线所有列共线
2过原点的平面两列线性无关,第三列冗余
3整个 $\mathbb{R}^3$三列线性无关,$A$ 可逆

此规律可推广:对 $m \times n$ 矩阵,列空间是 $\mathbb{R}^m$ 中的 $r$ 维子空间,$r$ 即为秩。

混音台类比:想象一个带三个推子(对应三列)的音频混音台,主输出即为列空间。若两个通道播放相同乐器,调节推子不会产生新声音——这种冗余正是“秩亏”在听觉上的体现。


零空间:被压缩的方向#

线性代数(五):线性方程组与列空间 — 章节小结图

定义#

$$ N(A) = \{ \vec{x} \mid A\vec{x} = \vec{0} \} $$

零空间必含零向量(因 $A\vec{0} = \vec{0}$ ),关键问题是:是否存在非零向量?

零空间 N(A):A 把哪些方向碾成了零

图示揭示了几何本质。左图:矩阵 $A=\begin{pmatrix}1&2\\2&4\end{pmatrix}$ 行线性相关,零空间为整条直线 $\text{span}\{(-2,1)\}$ ——该方向上所有向量均被压至原点;其像(列空间)则是方向 $(1,2)$ 的直线。右图:从 $\mathbb{R}^3$$\mathbb{R}^2$ 的投影(丢弃 $z$ 坐标)的零空间是整个 $z$ 轴——所有竖直分量被抹除。

零空间如何控制解的唯一性#

$$ A(\vec{x}_p + \vec{n}) = A\vec{x}_p + A\vec{n} = \vec{b} + \vec{0} = \vec{b} $$ $$ \{ \vec{x}_p + \vec{n} \mid \vec{n} \in N(A) \} $$

几何上,这是将零空间(过原点的子空间)沿特解平移所得的仿射子空间——解集本身。

  • $N(A) = \{\vec{0}\}$ :解唯一(若存在);
  • $N(A)$ 含非零向量:解无穷多,由零空间参数化。

压路机类比:压路机将 3D 物体压成 2D 煎饼,所有竖直运动信息丢失——竖直方向即零空间。两个仅在高度上不同的物体压扁后完全相同:零空间正是这种“不可逆压缩”带来的全部模糊性。


秩:有效维度#

$$ \text{rank}(A) = \dim C(A) = \text{消元后主元个数} $$

它等于线性无关列的最大数目,也(奇妙地)等于线性无关的最大数目。行秩等于列秩——此定理证毕后看似平凡,却深刻揭示了行与列间的对称性。

秩的含义#

秩即有效维度数——变换实际保留的独立方向数。

$3\times 3$ 矩阵秩几何效应
3(满秩)$\mathbb{R}^3$ 映满 $\mathbb{R}^3$ ,可逆
2将 3D 空间压至平面
1将 3D 空间压至直线
0零矩阵,一切归零

信息类比:秩即独立信息通道数。彩色照片每像素含 R、G、B 三通道(秩 3);转为灰度后秩降为 1,丢失两通道。机器学习中的低秩近似正是此思想的应用:仅保留数据矩阵的主导通道,舍弃其余。

1
2
3
4
5
6
7
import numpy as np

A = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

print(f"秩: {np.linalg.matrix_rank(A)}")  # 2  (第三行 = 2*第二行 - 第一行)

秩-零化度定理#

$$ \boxed{\;\text{rank}(A) + \dim N(A) = n\;} $$

换言之:保留的维度 + 被压缩的维度 = 输入总维度。无中生有,亦无凭空消失。

秩-零化度定理:每个输入维度要么被保留,要么被压缩

左图柱状图直观呈现该定理:对任意矩阵,蓝色(秩)与琥珀色(零化度)之和恒为 $n$ 。右图饼图则将输入空间 $\mathbb{R}^n$ 划分为“保留部分”(行空间)与“压缩部分”(零空间)。

示例#

$$ \dim N(A) = n - r = 5 - 2 = 3 $$

三个自由变量,三维零空间,二维列空间嵌于 $\mathbb{R}^3$ 中——仅凭一个数字即可解码完整结构。


$A\vec{x}=\vec{b}$ 的四种情形#

对秩为 $r$$m \times n$ 矩阵,仅存四种可能。

Ax = b 的三种面貌:唯一解、无穷多解、无解

情形 1:$r = m = n$ —— 方阵且满秩#

$A$ 可逆。对任意 $\vec{b}$ ,存在唯一解 $\vec{x} = A^{-1}\vec{b}$ 。列空间为全 $\mathbb{R}^m$ ,零空间仅为 $\{\vec{0}\}$

情形 2:$r = n < m$ —— 高瘦矩阵且列满秩(超定)#

方程数多于未知数。列空间为 $\mathbb{R}^m$ 的真子空间,故多数 $\vec{b}$ 不可达。若解存在则唯一,但实践中常用最小二乘法寻找最近可达点——即上图最右面板中的橙点。

情形 3:$r = m < n$ —— 矮宽矩阵且行满秩(欠定)#

未知数多于方程数。列空间填满 $\mathbb{R}^m$ ,故任意 $\vec{b}$ 均有解;但零空间维数 $n-m > 0$ ,导致解无穷多。中图展示典型情形:解集为一条直线(或平面等),所有点均为有效解。

情形 4:$r < m$$r < n$ —— 秩亏#

最微妙的情形。部分 $\vec{b}$ 无解,其余则有无穷多解——两种病态并存。


四个基本子空间#

对秩为 $r$$m \times n$ 矩阵 $A$ ,四个子空间道尽其结构:

子空间符号所属空间维度
列空间$C(A)$$\mathbb{R}^m$$r$
零空间$N(A)$$\mathbb{R}^n$$n - r$
行空间$C(A^T)$$\mathbb{R}^n$$r$
左零空间$N(A^T)$$\mathbb{R}^m$$m - r$

它们构成两对正交互补空间:

  • $\mathbb{R}^n$ 中:行空间与零空间正交互补。任意向量可唯一分解为“有用部分”(行空间)与“浪费部分”(零空间);
  • $\mathbb{R}^m$ 中:列空间与左零空间正交互补。任一输出方向要么在列空间中,要么完全不可达。

矩阵 $A$ 在行空间与列空间之间建立双射(二者均为 $r$ 维),并将零空间压至零。Strang 称此为“线性代数的大图景”——一旦内化,你便不再视矩阵为数字表格,而将其视为几何机器。


应用实例#

最小二乘:无精确解时的对策#

$$ A^T A \hat{x} = A^T \vec{b} $$

几何上,$A\hat{x}$$\vec{b}$ 在列空间上的正交投影——最近可达点。

1
2
3
4
5
6
7
import numpy as np

A = np.array([[1, 1], [2, 1], [3, 1], [4, 1]])
b = np.array([2, 3, 5, 4])

x, *_ = np.linalg.lstsq(A, b, rcond=None)
print(f"最佳拟合: y = {x[0]:.2f}x + {x[1]:.2f}")

计算机图形学:投影#

$$ P = \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \end{pmatrix} $$

其零空间为整个 $z$ 轴:深度信息被摧毁,故单张 2D 图像无法恢复 3D 结构(需立体视觉、运动或学习先验)。

电路分析#

基尔霍夫电流定律的矩阵形式为 $A\vec{i} = \vec{0}$ ,其中 $A$ 为网络关联矩阵。$A$ 的零空间即合法回路电流空间,其维数等于电路中独立回路数——一个由纯线性代数导出的拓扑事实。


深层直觉:计算前三问#

面对线性方程组,勿急于消元。先问:

  1. 列空间是什么? 它告诉你哪些 $\vec{b}$ 可解;
  2. 零空间是什么? 它说明解是否唯一,以及解集形状;
  3. 秩是多少? 它量化 $A$ 保留的信息量。

消元虽可回答这些问题,但仅是簿记工具——几何才是核心。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import numpy as np

def analyze_system(A, b):
    """打印 Ax = b 的解结构"""
    m, n = A.shape
    r = np.linalg.matrix_rank(A)
    r_aug = np.linalg.matrix_rank(np.column_stack([A, b]))

    print(f"矩阵: {m}x{n}, 秩={r}, 零化度={n-r}")

    if r_aug > r:
        print("  → 无解(b 不在列空间中)")
    elif r == n:
        print("  → 唯一解")
        print(f"     x = {np.linalg.lstsq(A, b, rcond=None)[0]}")
    else:
        print(f"  → 无穷多解({n-r} 个自由变量)")
        print(f"     一个特解 x = {np.linalg.lstsq(A, b, rcond=None)[0]}")

analyze_system(np.array([[1, 2], [3, -1]], dtype=float),
               np.array([5, 1], dtype=float))

analyze_system(np.array([[1, 2, 3], [2, 4, 6]], dtype=float),
               np.array([1, 2], dtype=float))

总结#

概念告知内容
列空间 $C(A)$哪些 $\vec{b}$ 可解
零空间 $N(A)$解是否唯一;解集形状
$A$ 保留的独立方向数
秩-零化度$\text{rank} + \text{nullity} = n$ —— 维度守恒律
四个子空间任意矩阵的完整结构图

线性代数的精髓在于通过空间与维度理解方程,而非机械计算。消元仍是主力算法,但其真正使命是揭示早已存在的几何结构。


稀疏矩阵捷径:$A\vec{x}=\vec{b}$ 复杂度从 $O(n^3)$ 降至 $O(n)$ #

稠密 $n\times n$ 矩阵通过 LU 分解求解 $Ax=b$ 的开销为 $\Theta(n^3)$ 。当 $n=10^6$ 时,约需 $10^{18}$ FLOPs——不可行。然而有限元模拟、推荐系统与图问题常能在秒级求解同等规模系统,秘诀在于稀疏性

矩阵稀疏指非零元占比极低(如 $\le 1\%$ )。例如二维网格上的离散 Laplacian,每行仅 5 个非零元,与网格大小无关。若 $A$$\mathrm{nnz}(A)$ 个非零元,则三方面同步改善:

  1. 存储$n^2$ 个 double 降至约 $2\,\mathrm{nnz}(A)$ 个 double 加索引数组。CSR(Compressed Sparse Row)为标准布局;
  2. 矩阵-向量乘 $Ax$ 开销从 $\Theta(n^2)$ 降至 $\Theta(\mathrm{nnz}(A))$ 。对百万格点的二维 Laplacian,单次乘法仅需 $5\times 10^6$ FLOPs——不足毫秒;
  3. 迭代求解器如共轭梯度法(CG,用于 SPD 矩阵)或 GMRES(通用)仅依赖矩阵-向量乘。总开销为 $\Theta(k\cdot \mathrm{nnz}(A))$$k$ 为迭代次数(CG 通常为 $\sqrt{\kappa(A)}$ ,常为 $10^2$$10^3$ )。

实例:在 $n=10^5$ 网格点上求解一维 Poisson 问题 $-u'' = f$

1
2
3
4
5
6
7
8
9
import numpy as np
import scipy.sparse as sp
import scipy.sparse.linalg as spla
n = 100000
diag = 2.0 * np.ones(n)
off  = -1.0 * np.ones(n - 1)
A = sp.diags([off, diag, off], [-1, 0, 1], format="csr")
b = np.ones(n)
x, info = spla.cg(A, b, rtol=1e-8)   # 大约 600 次迭代,耗时 ~0.5 秒

同问题若用稠密 np.linalg.solve,需 $10^{15}$ FLOPs 与 80 GB 内存。稀疏迭代在笔记本上一秒内完成。

稀疏性何时失效?当直接分解产生填充(fill-in)时。即使 $A$ 稀疏,LU 分解中的 $L$$U$ 可能近乎稠密——如箭头矩阵可将 $O(n)$ 非零元扩至 $O(n^2)$ 。故 scipy 提供 splu 并支持 AMD、METIS 等重排策略以最小化填充,且超大系统常优先选用迭代法而非直接求解。


scipy.linalg.solve 底层机制#

调用 scipy.linalg.solve(A, b) 处理稠密 $n\times n$ 矩阵时,不会先计算 $A^{-1}$ 再相乘,而是调用 LAPACK 的 dgesv,步骤如下:

  1. 分解:通过偏主元高斯消元得 $PA = LU$dgetrf),耗时 $\tfrac{2}{3}n^3$ FLOPs。偏主元(行交换使主元为列中绝对值最大者)保障数值稳定性;
  2. 前代:前向替换解 $Ly = Pb$$n^2$ FLOPs;
  3. 回代:后向替换解 $Ux = y$$n^2$ FLOPs。

总计 $\tfrac{2}{3}n^3 + 2n^2$ FLOPs。显式计算 $A^{-1}$$2n^3$ FLOPs(多 3 倍),且数值稳定性更差solve(A, b) 相对误差界为 $\kappa(A)\cdot \varepsilon$ ,而 inv(A) @ b 额外引入 $\kappa(A)$ 因子。几乎不存在显式求逆的合理场景。对多右端项,复用 LU 分解即可。

若已知 $A$ 的更多结构,可选更快例程:

  • $A$ 对称正定:cho_solve(Cholesky),$\tfrac{1}{3}n^3$ FLOPs,速度翻倍;
  • $A$ 对称不定:ldl 分解;
  • $A$ 带状(带宽 $b$ ):solve_banded$\Theta(n b^2)$ FLOPs;
  • $A$ 三角:solve_triangular$n^2$ FLOPs(无需分解)。

原则:你命名的每一分结构,都有对应的加速求解器。普通 solve(A, b) 是最慢的正确答案;专用例程快 2 至 1000 倍。本章教你识别何种结构——答案编码于四个基本子空间:秩、对称性、定性、带宽。


下一步#

第 6 章 :特征值与特征向量。多数向量经变换后方向改变,但少数特殊向量仅被缩放。这些特征向量是 $A$ 的自然坐标轴——矩阵在其上仅表现为简单拉伸。找到它们,便能掌握任意线性系统的长期行为。

本系列

线性代数 18 篇

  1. 01 线性代数(一):向量的本质——不仅仅是箭头
  2. 02 线性代数(二):线性组合与向量空间
  3. 03 线性代数(三):矩阵作为线性变换
  4. 04 线性代数(四):行列式的秘密
  5. 05 线性代数(五):线性方程组与列空间 当前
  6. 06 线性代数(六):特征值与特征向量
  7. 07 线性代数(七):正交性与投影——当向量互不干扰
  8. 08 线性代数(八):对称矩阵与二次型
  9. 09 线性代数(九):奇异值分解 SVD
  10. 10 线性代数(十):矩阵范数与条件数——数值计算的健康体检
  11. 11 线性代数(十一):矩阵微积分与优化——从梯度到反向传播
  12. 12 线性代数(十二):稀疏矩阵与压缩感知——少即是多的数学奇迹
  13. 13 线性代数(十三):张量与多线性代数——从标量到高维数据立方体
  14. 14 线性代数(十四):随机矩阵理论——混沌中的秩序
  15. 15 线性代数(十五):机器学习中的线性代数——从 PCA 到推荐系统
  16. 16 线性代数(十六):深度学习中的线性代数——从全连接到 Transformer
  17. 17 线性代数(十七):计算机视觉中的线性代数——从像素到三维重建
  18. 18 线性代数(十八):前沿应用与总结——量子计算、GNN、大模型,与十八章回望

读有所得?

GitHub 关注我 → 新文周更

GitHub