1.4 向量空间与四大子空间
前三节我们用向量—矩阵—方程组的语言解决了线性代数的基本计算问题。本节将完成一次重要的视角跃迁——从具体的数表上升到抽象的空间。我们将看到,矩阵
1.4.1 从几何平面到抽象空间的跃迁
向量空间的严格公理化定义
到目前为止,我们把向量理解为有方向的箭头或一列数。但这种直觉在遇到多项式、函数、矩阵等对象时会失效:它们不是箭头,也不是一列数,却同样可以进行加法和数乘等运算。为了统一刻画这些对象,线性代数提出了向量空间(Vector Space)的公理化定义。
向量空间
加法公理(4 条):
- 交换律:
- 结合律:
- 加法单位元:存在
,使 - 加法逆元:对每个
,存在 ,使
数乘公理(4 条):
- 数乘对向量加法的分配律:
- 数乘对实数加法的分配律:
- 数乘结合律:
- 数乘单位元:
这八条公理是向量空间的最小完备条件——任何满足这八条的对象都可以用线性代数的全部工具研究。这种公理化思维是现代数学的标志:不关心对象是什么,只关心对象能做什么。
常见的向量空间实例
公理化定义的威力在于,它可以涵盖不同的对象:
- 欧氏空间
:常见的向量空间,元素是 元实数组,加法和数乘按分量进行。 - 多项式空间
:所有次数不超过 的实系数多项式构成的空间。 中的元素形如 ,加法是多项式相加,数乘是多项式数乘。 - 矩阵空间
:所有 实矩阵构成的空间。加法是矩阵加法,数乘是矩阵数乘。 - 函数空间:定义在
上的所有连续函数构成的空间 ,加法是函数相加,数乘是函数数乘。这是无限维向量空间的典型例子。
这些空间的元素形态各异(数组、多项式、矩阵、函数),但都满足八条公理,因此都可以用线性代数的语言研究。
向量空间的十大基本性质
从八条公理可以推导出一系列常用性质,其中重要的有:
- 零元唯一:若
都是加法单位元,则 。 - 负元唯一:每个向量的负元是唯一的。
:零数乘任何向量得零向量。 :任何数乘零向量得零向量。 :负一数乘得负元。 - 若
,则 或 :这是消去律的向量版本。
这些性质的证明都需要从公理出发,是抽象代数训练的基础。
什么是子空间?
子空间(Subspace)是向量空间
子空间三要素验证法:
- 非空(通常验证包含零向量):
- 加法封闭:若
,则 - 数乘封闭:若
, ,则
为什么只需这三条?因为其余公理(交换律、结合律等)在
平凡子空间与真子空间
任何向量空间
- 零空间
:只含零向量,维数为 0。 - 全空间
自身。
既非
子空间的几何直觉:必须穿过原点
子空间最关键的几何特征是必须穿过原点。这是因为子空间必须包含零向量(三要素之一)。因此有:
过原点的平面是
不过原点的平面属于仿射集(将在 1.4.7 节看到它与子空间的关系),不属于子空间
过原点的直线是子空间
不过原点的直线不是子空间
这一几何直觉是理解四大子空间的基石:所有四大子空间都是过原点的。
import numpy as np
# 验证子空间三要素:过原点的平面 z = 0 是 R^3 的子空间
# 任取两个向量 u, v 在平面上(即 z 分量为 0)
u = np.array([1, 2, 0])
v = np.array([3, -1, 0])
# 1. 包含零向量:零向量 [0,0,0] 在平面上
print(f"零向量在平面上: {0 == 0}")
# 2. 加法封闭:u + v 仍在平面上
print(f"u + v = {u + v}, z 分量 = {(u+v)[2]}") # z=0
# 3. 数乘封闭:5u 仍在平面上
print(f"5u = {5*u}, z 分量 = {(5*u)[2]}") # z=0
# 反例:不过原点的平面 z = 1 不是子空间
# u = [1, 2, 1] 在平面上,但 0*u = [0, 0, 0] 不在平面上(z=0 ≠ 1)
print(f"\n反例:z=1 平面上向量 [1,2,1] 数乘 0 得 {0*np.array([1,2,1])},z 分量为 0 ≠ 1,不封闭")交互演示:子空间三要素验证
下面的演示用 3D 场景直观展示子空间必须过原点这一核心特征。4 个预设按钮分别展示:
- 过原点平面(绿色,是子空间):平面
,三要素全部通过 - 过原点直线(绿色,是子空间):直线方向向量
,过原点 - 偏移平面(红色,非子空间):平面
( ),不过原点 - 偏移直线(红色,非子空间):直线
( ),不过原点
关键观察:
- 绿色集合的包含零向量项显示通过,红色集合显示不通过
- 两个示例向量
(黄色箭头)在集合内,其和 (橙色箭头)——绿色集合中和仍在集合内(加法封闭),红色集合中和通常不在集合内 - 不过原点的集合是仿射集,是子空间的平移,将在 1.4.7 节与子空间建立联系
交互演示:本节子空间三要素的动态验证已合并至下一节的
SpanBasisDemo组件中,可滑动调节向量并观察张成空间是否过原点。
1.4.2 张成、线性无关与基 —— 空间的骨架
张成的正式定义
给定
张成是一个子空间——它包含零向量(所有
张成的几何意义
张成的几何形状取决于向量的个数和是否共线。单个非零向量
张成的维度等于这组向量的有效方向数,即接下来定义的秩。
线性相关与线性无关
一组向量
否则称为线性无关(Linearly Independent)——即上式仅当所有
几何直觉:线性相关意味着至少有一个向量可以由其余向量线性表示——它没有贡献新方向。线性无关意味着每个向量都贡献独立的方向。
判定线性无关的实用方法
把向量作为列组成矩阵
- 线性无关
(满列秩) - 线性相关
这是最实用的判定方法——只需做高斯消元数主元个数。
基的双重判定条件
基(Basis)是向量空间
- 线性无关:
中的向量线性无关 - 张成整个空间:
基是空间的骨架——既不冗余(线性无关),又足够(张成整个空间)。任何向量都可以唯一地表示为基的线性组合。
标准基与坐标向量
但如果换一组基,同一个向量的坐标会改变。坐标的意义在于:它把几何对象翻译成代数数对,使我们能用数论、组合等工具研究几何问题。
维数的定义
向量空间
(基为 ) (基为所有只有一个元素为 1、其余为 0的矩阵) (无限维)
基的扩张定理与缩减定理
扩张定理(Extension Theorem):向量空间
缩减定理(Reduction Theorem):向量空间
这两个定理保证了基的存在性——无论从哪个方向出发(从线性无关组扩张,或从张成组缩减),都能找到一组基。
维数的良定义性
一个自然的问题:同一空间的不同基,向量个数相同吗?答案是相同——这就是维数的良定义性。证明思路:若
import numpy as np
from sympy import Matrix
# 示例:判断三个向量是否构成 R^3 的基
v1 = np.array([1, 0, 0])
v2 = np.array([1, 1, 0])
v3 = np.array([1, 1, 1])
A = np.column_stack([v1, v2, v3])
print(f"矩阵 A =\n{A}")
print(f"行列式 = {np.linalg.det(A):.4f}") # 1.0 ≠ 0
print(f"rank = {np.linalg.matrix_rank(A)}") # 3
# rank = 3 = 向量个数 → 线性无关
# rank = 3 = dim(R^3) → 张成整个 R^3
# 因此 {v1, v2, v3} 是 R^3 的一组基
# 反例:三个共线向量
w1 = np.array([1, 2, 3])
w2 = np.array([2, 4, 6]) # = 2*w1
w3 = np.array([-1, -2, -3]) # = -w1
W = np.column_stack([w1, w2, w3])
print(f"\n共线向量组 rank = {np.linalg.matrix_rank(W)}") # 1,线性相关
print(f"张成的子空间维数 = 1(直线)")交互演示:张成、线性无关与基
下面的演示让你直接操作向量,观察张成的子空间如何变化。4 个预设按钮覆盖四种典型情形:
- 单向量:1 个向量张成一条过原点的直线(rank=1)
- 两不共线向量:2 个向量张成一个过原点的平面(rank=2,线性无关)
- 三不共面向量:3 个向量张成整个
(rank=3,构成基) - 共线向量:2 个共线向量仍只张成直线(rank=1,线性相关)
关键观察:
- 启用向量数 ≠ rank(共线时启用 2 个但 rank=1)
- rank = 启用数 → 线性无关;rank < 启用数 → 线性相关
- rank = 3 → 构成
的基;rank < 3 → 只是真子空间 - 张成子空间用半透明几何体显示:直线(绿)、平面(黄)、整个空间(青色线框)
1.4.3 列空间 —— 变换的靶向范围
列空间的严格定义
矩阵
其中
列空间的几何本质
列空间回答了一个核心问题:矩阵
列空间是
列空间维数定理
列空间维数定理:
这一结论的直觉是:列空间的基就是
列空间的基:主元列
如何找列空间的基?做法是:
- 对
做高斯消元,得到 RREF - 找出主元所在的列(主元列)
- 回到原矩阵
,取出对应位置的列——这些列就是 的基
注意:基向量应从原矩阵中取出。RREF 的主元列只是位置标记,真正的基向量来自原矩阵。
列空间与满射的关系
线性映射
列空间在 Ax = b 中的核心地位
相容性定理:方程组
这一结论自然:
这就是 1.3 节克罗内克-卡佩利定理的几何本质——
列空间的几何投影
在 3D 空间中可视化列空间:
- 满秩 rank=3:
是整个 (任何 都有解) - rank=2:
是过原点的平面( 必须落在此平面内才有解) - rank=1:
是过原点的直线( 必须落在此直线上才有解)
当
import numpy as np
# 示例:3x3 矩阵的列空间
A = np.array([[1, 0, 1],
[0, 1, 1],
[0, 0, 0]]) # 第三行全零,rank=2
# rank = 2,列空间是 z=0 平面(前两列张成)
print(f"rank(A) = {np.linalg.matrix_rank(A)}") # 2
print(f"列空间维数 = 2(z=0 平面)")
# b1 在列空间内(z=0)
b1 = np.array([2, 3, 0])
print(f"\nb1 = {b1}, 在 C(A) 中? rank([A|b1]) = {np.linalg.matrix_rank(np.column_stack([A, b1]))}") # 2 = rank(A)
# b2 不在列空间内(z=1)
b2 = np.array([2, 3, 1])
print(f"b2 = {b2}, 在 C(A) 中? rank([A|b2]) = {np.linalg.matrix_rank(np.column_stack([A, b2]))}") # 3 > rank(A)
# b2 在列空间上的投影 = 去掉 z 分量
b2_proj = np.array([2, 3, 0])
print(f"b2 在 C(A) 上的投影 = {b2_proj}(最小二乘解的右端)")交互演示:列空间与方程可解性
下面的演示展示列空间
- 满秩 rank=3:列空间是整个
(青色线框立方体),任何 都有解 - 秩 2:列空间是过原点平面(黄色半透明),
必须在平面内才有解 - 秩 1:列空间是过原点直线(橙色),
必须在直线上才有解
关键交互:
- 拖动
向量的 3 个滑块,观察 是否落在 中 时,显示 在 上的投影(金色虚线 + 投影点小球) - 实时显示
、 、判定结果、解的情况
交互演示:列空间与零空间的联合演示见 1.4.4 节末尾
ColumnNullSpaceDemo组件,可同时观察与 的对称结构。
1.4.4 零空间 —— 变换的压缩内核
零空间的严格定义
矩阵
零空间也叫核(Kernel),记作
零空间的几何本质
零空间回答了另一个核心问题:哪些输入被
零空间是
(因为 ,平凡解总是存在) - 若
,则 (因为 ) - 若
,则 (因为 )
零空间维数定理
零空间维数定理(秩-零度定理):
零空间的基:基础解系
如何找零空间的基?做法是:
- 化
为 RREF - 主元列对应主变量,非主元列对应自由变量
- 对每个自由变量,令它取 1、其余自由变量取 0,回代求出主变量
- 得到一个基础解向量;自由变量个数 = 基础解系向量个数 = 零度
这些基础解向量就是
零空间与单射的关系
线性映射
零空间的几何可视化
在 3D 空间中可视化零空间(
- rank=3(满秩):
,零空间仅原点(0 维点) - rank=2:
,零空间是过原点的直线 - rank=1:
,零空间是过原点的平面 - rank=0(零矩阵):
,零空间是整个
零空间的压缩效应
零空间越大,意味着被压成零的向量越多——变换的信息损失越大。极端情况
零空间与列空间形成对称:列空间描述输出去哪里,零空间描述哪些输入消失。两者共同刻画了线性变换的行为画像。
零空间的对称之美
列空间是
1.4.5 行空间 —— 被忽视的行视角
行空间的严格定义
矩阵
其中
行空间的几何本质
行空间是
行视角回答的问题是:矩阵
核心定理:行秩等于列秩
行秩等于列秩定理:
这是线性代数重要的定理之一。它表明:无论从行视角还是列视角看,矩阵承载的独立信息量是相同的。行向量和列向量的有效方向数相等——尽管它们处于不同的空间(
这一定理的证明思路:初等行变换不改变行空间(行向量间的线性关系不变),且不改变列空间的维度(线性相关的列仍线性相关)。化
行空间的基:非零行
如何找行空间的基?做法是:
- 对
做高斯消元,得到 RREF - RREF 中的非零行就是行空间的一组基
注意:行空间的基可以直接从 RREF 读取(不需要回到原矩阵),因为初等行变换不改变行空间。这与列空间的基求法(必须回到原矩阵)形成对比。
行空间与列空间的对称性
行空间和列空间在求解
:方程组有解(输出空间的约束) 的行空间分量决定唯一解:若 (行空间分量 + 零空间分量),则 (因为 )。因此方程组的特解可以取在行空间中,这是最小范数解的来源。
import numpy as np
from sympy import Matrix
A = np.array([[1, 2, 3],
[2, 4, 6], # = 2 × 第一行
[1, 1, 1]])
# 行空间:消元后非零行
M = Matrix(A)
rref, pivots = M.rref()
print(f"RREF:\n{rref}")
print(f"主元列: {pivots}") # (0, 2)
print(f"rank = {len(pivots)}") # 2
# 行空间的基 = RREF 的非零行
print(f"\n行空间基(RREF 非零行):")
for i in range(len(pivots)):
print(f" r{i+1} = {list(rref.row(i))}")
# 列空间的基 = 原矩阵的主元列
print(f"\n列空间基(原矩阵主元列):")
for c in pivots:
print(f" a{c+1} = {A[:, c]}")1.4.6 左零空间 —— 行视角的压缩内核
左零空间的严格定义
矩阵
等价地,
左零空间的几何本质
左零空间是
左零空间是
左零空间的基求法
如何找左零空间的基?做法是:
- 构造增广矩阵
( 是 单位矩阵) - 对其做初等行变换,把
化为 RREF - RREF 中零行对应的
部分,就是左零空间的基
或者更简单地:对
左零空间与列空间的正交互补
左零空间与列空间处于同一空间
:左零空间中的向量与列空间中的向量正交 :两者维度之和恰为 ,填满整个
这一关系是四大子空间结构图的核心之一。
左零空间与相容性检验
左零空间中的向量
在工程中,左零空间常对应系统的守恒量或约束方程。例如电路中的基尔霍夫电流定律、力学中的力平衡,都是某个矩阵的左零空间条件。
左零空间的工程意义
左零空间的维数
1.4.7 四大子空间的结构关系 —— 正交性与维度关系
维度方程组:四大维数的统一公式
设
| 子空间 | 符号 | 所在空间 | 维数 |
|---|---|---|---|
| 列空间 | |||
| 零空间 | |||
| 行空间 | |||
| 左零空间 |
这四个维数完全由
- 行空间与零空间都在
中,维数和为 - 列空间与左零空间都在
中,维数和为
这两个维数和等于空间维数的事实,暗示着更深层的几何关系——正交互补。
正交补的定义
子空间
即
也是子空间
核心正交关系 1:行空间 ⊥ 零空间
定理:在
证明:设
因此
几何意义:输入空间
核心正交关系 2:列空间 ⊥ 左零空间
定理:在
证明:设
因此
几何意义:输出空间
正交分解的唯一性
正交分解的唯一性来自一个关键事实:正交补的交集只有零向量。若
这意味着分解
四大子空间在 Ax = b 中的统一几何图景
把四大子空间与
输入侧(
): :行空间分量,决定输出 :零空间分量,被 压成零 (零空间分量消失)
输出侧(
): :列空间分量,可被 达到 :左零空间分量,不可被 达到
可解性:
有解 (即 , 完全在列空间中) 解的唯一性:若
是特解,则通解 ( )。当 (满列秩)时解唯一。
行空间与列空间的同构关系
虽然行空间
这一映射是双射(一一对应)——行空间的每个向量唯一对应列空间的一个向量,反之亦然。同构保持线性结构,因此行空间与列空间代数上相同——它们维数相等(都为
左零空间与相容性检验
左零空间中的向量
在工程中,左零空间的基向量给出了系统的守恒律——这些是任何解都必须满足的约束。例如:
- 电路中基尔霍夫电流定律:电流代数和为零
- 力学中力平衡:合力为零
- 流体力学中连续性方程:质量守恒
这些都是矩阵的左零空间条件的具体表现。
import numpy as np
from sympy import Matrix
# 完整示例:四大子空间
A = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]) # 知名矩阵,rank=2
m, n = A.shape
r = np.linalg.matrix_rank(A)
print(f"A 是 {m}×{n} 矩阵,rank = {r}")
print(f"\n四大子空间维数:")
print(f" 列空间 C(A) ⊂ R-{m}, 维数 = {r}")
print(f" 零空间 N(A) ⊂ R-{n}, 维数 = {n - r}")
print(f" 行空间 C(A^T) ⊂ R-{n}, 维数 = {r}")
print(f" 左零空间 N(A^T) ⊂ R-{m}, 维数 = {m - r}")
# 验证正交关系
M = Matrix(A)
rref, pivots = M.rref()
# 行空间基 = RREF 非零行
row_basis = [list(rref.row(i)) for i in range(r)]
print(f"\n行空间基(RREF 非零行): {row_basis}")
# 零空间基
null_basis = M.nullspace()
print(f"零空间基: {[list(v.T) for v in null_basis]}")
# 验证行空间 ⊥ 零空间
if null_basis:
for i, rb in enumerate(row_basis):
for j, nb in enumerate(null_basis):
dot = sum(a*b for a, b in zip(rb, list(nb)))
print(f" 行空间基{i} · 零空间基{j} = {float(dot):.6f}(应为 0)")
# 列空间基 = 原矩阵主元列
col_basis = [A[:, c].tolist() for c in pivots]
print(f"\n列空间基(原矩阵主元列): {col_basis}")
# 左零空间基 = A^T 的零空间
left_null_basis = M.T.nullspace()
print(f"左零空间基: {[list(v.T) for v in left_null_basis]}")交互演示:四大子空间终极展示
下面的演示把四大子空间的完整结构同时可视化——左侧 3D 场景是输入空间
3 个预设按钮(点击观察维度变化):
- 满秩 r=3:行空间=整个
,零空间=原点;列空间=整个 ,左零空间=原点 - 秩 r=2:行空间=绿色平面,零空间=红色直线(左场景);列空间=蓝色平面,左零空间=橙色直线(右场景)
- 秩 r=1:行空间=绿色直线,零空间=红色平面(左场景);列空间=蓝色直线,左零空间=橙色平面(右场景)
关键观察:
- 左场景(
):绿色行空间与红色零空间正交,且维数和 (填满整个空间) - 右场景(
):蓝色列空间与橙色左零空间正交,且维数和 (填满整个空间) - 中间矩阵
的标签提示: - 底部表格实时显示四大子空间的维数、所在空间、正交补关系
- 验证维度方程:
,
本章小结
本节完成了从具体数表到抽象空间的跃迁,建立了线性代数的核心结构图景:
- 向量空间用八条公理定义,涵盖
、多项式、矩阵、函数等不同对象 - 子空间必须过原点,三要素验证(含零、加法封闭、数乘封闭)
- 基是空间的骨架——线性无关且张成整个空间,基的个数即维数
- 四大子空间:
- 列空间
:变换的靶向范围,维数 - 零空间
:变换的压缩内核,维数 - 行空间
:行视角的张成,维数 - 左零空间
:行视角的压缩核,维数
- 列空间
- 两大正交补关系:
- 行空间
零空间(在 中) - 列空间
左零空间(在 中)
- 行空间
- 行秩 = 列秩:行空间与列空间维数相等(
),通过矩阵 建立同构
这一结构图景是后续章节的基础:1.5 节将用正交投影求解最小二乘问题,1.6 节将用特征值刻画矩阵的本质方向,1.7 节的 SVD 是四大子空间的核心应用——它把任意矩阵分解为在行空间找正交基 + 在列空间找正交基 + 中间用奇异值连接的形式。
练习题
第 1 题 概念推导
设
参考答案
先证交集只含零向量。设
再证分解唯一。设
第 2 题 代码验证
利用本节的 <FourSubspacesTheoremDemo> 交互组件,切换到秩 r=2 预设。观察左侧
参考答案
第 3 题 概念推导
设
参考答案
四大子空间维数与所在空间:
| 子空间 | 符号 | 所在空间 | 维数 |
|---|---|---|---|
| 列空间 | |||
| 零空间 | |||
| 行空间 | |||
| 左零空间 |
注意:虽然本例
常见错误
错误 1 · 子空间验证时遗漏不过原点这一条件
原因:判断某集合是否为子空间时,只检查加法封闭与数乘封闭,忽视集合必须包含零向量这一要求。例如集合
解决:子空间验证按三要素依次进行:含零向量、加法封闭、数乘封闭。其中含零向量等价于不过原点的集合直接排除。更简洁的做法是先检查
错误 2 · 把零空间放在
原因:混淆四大子空间所在的空间。零空间
解决:按输入侧/输出侧分组记忆:输入侧
错误 3 · 把维数等同于基的向量长度
原因:维数
解决:明确维数 = 基的向量个数这一规则。基向量本身的分量数由所在欧氏空间决定(
错误 4 · 把正交补等同于集合补集
原因:正交补
解决:明确正交补是几何概念,要求每个向量与