四个基本子空间与秩-零化度
上一章里,我们把“子空间、张成、基、维数”分开讲了一遍。那些概念像一套工具,现在该把它们真正用到矩阵上了。
给定一个矩阵 A,最常见的问题看上去是解方程 Ax=b。可如果只盯着某一个 b、某一个解 x,我们看到的只是矩阵的一次工作结果。把视线拉远一点,会出现四个更稳定的问题:
- 矩阵到底能产生哪些输出;
- 哪些输入会被它压成零;
- 它真正能识别输入中的哪些方向;
- 输出必须满足哪些隐藏关系。
这四个问题分别对应列空间、零空间、行空间和左零空间。它们不是四个互不相干的定义,而是同一台“矩阵机器”的四个侧面。
设 A 是一个 m×n 矩阵。矩阵乘法接收一个 n 维输入,给出一个 m 维输出:
A:Rn⟶Rm,x⟼Ax
先把这两个空间记牢:输入住在 Rn,输出住在 Rm。后面判断一个基向量写对没有,最简单的办法就是数它有几个分量。

矩阵把行空间中的有效输入送到列空间,把零空间中的输入压到零;同一侧的两个空间互相正交。
如果 A 是 m×n 矩阵,那么行空间和零空间住在输入空间 Rn;列空间和左零空间住在输出空间 R。行数 决定输出向量的长度,列数 决定输入向量的长度。
先用一个矩阵把四个空间串起来
这一章只用一个主要算例。这样你不用在每一节重新适应一组数字,可以把注意力放在四个空间之间的关系上。
考虑
A=101
它有 3 行、4 列,所以
A:R4⟶R3
输入 x 有 4 个分量,输出 Ax 有 3 个分量。
先看矩阵中已经能直接发现的关系。第 2 列是第 1 列的两倍,第 4 列是第 1 列与第 3 列之和:
a2=2a1,a4=a
第三行也是前两行之和:
r3=r1+r2
这些关系稍后会分别变成零空间中的方向和左零空间中的方向。
对 A 做行化简。第三行减去第一行,再减去第二行,得到
R=rref(A)=
主元位于第 1 列和第 3 列,因此
rank(A)=2
第 2、第 4 列没有主元,对应的 x2,x4 是自由变量。先别把这几句话当成消元步骤背下来。后面我们会解释:同样一份 RREF,为什么能同时告诉我们四个空间的基和维数。
四个空间各自在问什么
列空间:这台机器能到哪里
把 A 的列依次记作 a1,…,an。矩阵乘法的列向量读法是
Ax=x1a1+x2a
不管怎样选择输入 x,输出 Ax 都只能是这些列的线性组合。反过来,任何列的线性组合都能通过选择相应的 x1,…,xn 得到。因此列空间就是全部可能输出的集合:
C(A)={Ax:x∈Rn}=span{a
于是方程 Ax=b 是否有解,马上有了一个几何版本:
Ax=b 有解⟺b∈C(A)

列空间就是矩阵的“可达输出”。b 落在其中,Ax=b 才可能有解。
对本章的矩阵,只有第 1、第 3 列真正带来新方向:
a1=
因此
C(A)=span⎩⎨
列空间是 R3 中的一个二维平面。把线性组合写开:
c1
所以这个平面里的向量都满足
b3=b1+b2
这条关系就是本例中 Ax=b 的相容条件。
零空间:这台机器忘掉什么
零空间收集所有被矩阵送到零的输入:
N(A)={x∈Rn:Ax=0}
这里的向量住在 Rn,因为它们是输入,不是输出。
“被送到零”听起来像只关心齐次方程,其实它直接决定了非齐次方程的全部解。若 v∈N(A),那么
A(x+v)=Ax+Av=Ax
输入沿零空间方向移动,输出完全不变。矩阵看不出这次移动发生过。

零空间记录矩阵丢失的输入方向。沿这些方向走,Ax 不会改变。
本例中,解 Rx=0:
{x1+2x2+x
令
x2=s,x4=t
则
x1=−2s−t,x3=−t
于是
x=s−21
所以零空间的一组基是
⎩⎨⎧
这两条方向并不是凭空算出来的。第一条其实在说
−2a1+a2=0
第二条在说
−a1−a3+a4=0
换句话说,零空间把“列之间有哪些线性依赖”完整记录成了系数向量。
行空间:输入中哪些方向能被测到
行空间是矩阵各行张成的空间:
C(AT)=span{r1,…,rm
它也写作 Row(A)。之所以用 C(AT) 表示,是因为转置以后,原来的行就变成了列。
行空间为什么住在输入空间?因为 A 的每一行都有 n 个分量,它会与输入 x∈Rn 做点积:
Ax=r1x
每一个输出分量,都是某一行对输入做的一次“测量”。如果两行互相依赖,它们测到的信息也有重复。行空间留下的,正是这些测量中真正独立的方向。
本例的第三行等于前两行之和,所以行空间只需要前两行:
C(AT)=span{[
它是 R4 中的二维子空间。
左零空间:输出必须遵守哪些关系
左零空间是转置矩阵的零空间:
N(AT)={y∈Rm:ATy=
等价地,
yTA=0
向量 y 有 m 个分量,每个分量对应 A 的一行。于是 yTA=0 的意思是:用 y 作为系数,把矩阵的各行组合起来,结果为零。左零空间记录的是“行之间有哪些线性依赖”。
在本例中,
−r1−r2+r3=0
所以
y=−1−11
而且这个左零空间只有一维:
N(AT)=span⎩⎨
它与 Ax=b 的相容性直接相连。若 b=Ax,那么对任意 y∈N(AT),
yTb=yTAx=0
因此本例中的可达输出必须满足
[−1−11
也就是
b3=b1+b2

行空间描述有效测量方向;左零空间描述所有可达输出自动满足的关系。
一张表给四个空间定位
为什么一份 RREF 能读出这些基
行化简看上去只是在改矩阵里的数字,为什么它能揭示子空间?关键在于每一步初等行变换都可逆。把全部行变换合在一起,可以写成
R=EA
其中 E 是可逆矩阵。这个可逆性决定了哪些东西会保持,哪些东西只保持“索引”而不会保持原来的向量。
零空间可以直接从 RREF 求
因为 E 可逆,
Ax=0⟺EAx=0⟺Rx=0
所以
N(A)=N(R)
这就是我们可以从 RREF 的自由变量直接求零空间的原因。
对本例,RREF 中有两个自由变量。每次让一个自由变量取 1、其余自由变量取 0,就会得到一条“特殊解”:
v1=
它们线性无关,并且任意齐次解都是二者的线性组合,所以正好构成零空间的一组基。
行空间可以取阶梯形的非零行
一次行变换只是用原来的行做可逆的线性组合。新行都在旧行空间里;反过来,行变换可以倒做,所以旧行也都在新行空间里。因此
C(AT)=C(RT)
阶梯形矩阵的非零行为什么是一组基?因为每条非零行都有一个比下一行更靠左的主元位置。最左边的非零系数无法由后面的行抵消,这迫使它们线性无关;与此同时,行空间又没有因行变换而改变。所以,非零行既独立又张成原行空间。
本例可直接取
{[120
作为行空间基。
列空间只能借 RREF 找位置
这里最容易出错。行变换会把每一列左乘 E:
aj⟼Eaj
所以它通常会改变列向量在 Rm 中的具体位置,也就可能改变列空间这个集合。一般不能写
C(A)=C(R)
但是,可逆变换不会改变列之间的依赖关系。若
c1a1+⋯+cna
那么左乘 E 后
c1Ea1+⋯+cnEa
反过来也成立。因此 RREF 能准确告诉我们“第几列是独立列”,却不能替我们保留原来的列向量。
本例的主元在第 1、第 3 列。正确做法是回到原矩阵,取原来的第 1、第 3 列:
⎩⎨⎧
一句话记住区别:列空间“看 RREF 找主元位置,回原矩阵取列”;行空间“直接取阶梯形的非零行”;零空间“直接解 RREF 对应的齐次方程”。
左零空间要单独处理
左零空间解的是
ATy=0
它不能直接从 R 的左零空间照搬,因为 R=EA 会改变行之间关系的系数坐标。最稳妥的做法有两种:
- 行化简 AT,求 N(AT);
- 观察原矩阵各行之间的线性关系,把关系系数写成向量 y。
本例用第二种方法最快。由 r3=r1+r2,马上得到
y=−1−11
下面的交互工具使用的正是本章这组矩阵。切换四个按钮时,留意它每次究竟读取原矩阵还是 RREF。
秩与零化度:给输入自由度做一笔账
矩阵的秩是列空间的维数,也等于行空间的维数:
rank(A)=dimC(A)=dimC(AT)
列秩为什么等于行秩?把矩阵化到 RREF 后,两者都等于主元个数:每个主元对应一个独立列,也对应一条非零独立行。行变换不改变行秩,也不改变列之间的依赖关系,所以原矩阵的两种秩仍然相等。
零化度是零空间的维数:
nullity(A)=dimN(A)
若 A 有 n 列、秩为 r,RREF 中就有 r 个主元变量和 n−r 个自由变量。每个自由变量产生一条独立的零空间方向,所以
nullity(A)=n−r
于是得到秩-零化度关系:
rank(A)+nullity(A)=n

秩与零化度是在清点输入空间的维数。两边加起来必须等于矩阵的列数 n。
这条公式容易被背成“主元个数加自由变量个数等于未知数个数”。计算上没错,但它真正说的是一笔输入自由度账:
- 输入空间一共有 n 维;
- 其中 n−r 维落入零空间,矩阵把它们忘掉;
- 剩下的 r 维由行空间代表,矩阵能区分这些方向,并把它们送进 r 维的列空间。
这里要说得精确一点:主元变量只是消元后的坐标账本,“第几个变量是主元”会受到列排列和矩阵结构影响。真正与零空间互补的 r 维对象是行空间,不一定就是前 r 条坐标轴。
对本例,
n=4,r=2
因此
dimN(A)=4−2=2
这与我们找到的两条零空间基向量完全吻合。
交互工具把主元位置排列在前面,只是为了清楚显示 r+(n−r)=n 这笔账;实际矩阵的主元列不一定相邻。工具没有指定行数 m,可以把它理解为默认输出空间足够容纳所选的秩。
四个空间的维数一起对账
若 A 是 m×n 矩阵,秩为 r,那么
dimC(A)=r
dimN(A)=n−r
dimC(AT)=r
dimN(AT)=m−r
前两行清点输入空间 Rn,后两行清点输出空间 Rm:
r+(n−r)=n
r+(m−r)=m
本例中 m=3、n=4、r=2,所以
四个数字不是分别算出来后碰巧对上。它们由同一个秩 r 同时控制。
看到一个 m×n 矩阵,只要知道秩 r,四个基本子空间的维数就已经全部确定:r、n−r、、。但维数确定不等于基已经确定,具体基仍要通过原矩阵和行化简来找。
两对正交关系:四个空间怎样拼回两边
四个基本子空间最漂亮的地方,不只是维数能对账。它们在输入、输出两侧各自成一对正交补空间。
行空间与零空间正交
若 x∈N(A),那么
Ax=0
Ax 的每一个分量,都是 A 的一行与 x 的点积。因此每一行都与 x 正交,所有行的线性组合也都与 x 正交。于是
C(AT)⊥N(A)
本例中取行空间基
u1=
和零空间基
v1=
四个交叉点积都是零:
u1Tv1=0,u1T
u2Tv1=0,u2T
而且它们的维数加起来是
r+(n−r)=n
所以二者不仅互相垂直,还正好填满整个输入空间:
Rn=C(AT)⊕N(A)
符号 ⊕ 表示每个输入都能唯一拆成“行空间部分 + 零空间部分”。矩阵只会对行空间部分作出反应,零空间部分加上去也不会改变输出。
列空间与左零空间正交
若 y∈N(AT),那么
ATy=0
这句话等价于 y 与 A 的每一列都正交,所以它也与这些列的全部线性组合正交:
C(A)⊥N(AT)
本例的列空间基是
a1=
左零空间基是
y=−1−11
确实有
yTa1=0,yTa3
维数也刚好填满输出空间:
r+(m−r)=m
因此
Rm=C(A)⊕N(AT)
这句话给出了相容性的完整版本:一个 b∈Rm 属于列空间,当且仅当它与左零空间中的每个向量都正交。
b∈C(A)⟺yTb=0 对所有 y∈N(A
前面我们只说 yTb=0 是必要条件。现在借助正交补关系可以确认:检查完左零空间的一组基后,这些条件也足够保证 b 在列空间里。
相容性与全部解:四个空间一起工作
继续解本章矩阵对应的方程
Ax=b
写成方程组是
⎩⎨⎧
第三个左端等于前两个左端之和,所以右端也必须满足同样关系:
b3=b1+b2
把增广矩阵行化简,会更直白地看到这一点:
若 b3−b1−b2=,最后一行就是荒谬的
0=b3−b1−b2
方程无解。若 b3=b1+b2,方程相容。
一个具体的相容右端
取
b=314
因为 4=3+1,它位于列空间中。方程化为
x1+2x2+x4=3
x3+x4=1
令 x2=s、x4=t,得到
x1=3−2s−t,x3=1−
所以全部解是
x=
第一项是一个特解 xp,后两项正是零空间的一般向量:
x=xp+xn,xn∈
四个空间在解题时各有明确分工:
- 列空间判断目标 b 能不能达到;
- 左零空间把“能达到”翻译成相容条件;
- 找到一个特解后,零空间给出所有不会改变输出的自由方向;
- 行空间与零空间互补,记录矩阵真正识别的输入部分。
解的个数由两件事决定
判断 Ax=b 的解,先看相容性,再看零空间:
本例的零化度是 2。所以每一个相容右端都对应一个二维的解集;每一个不相容右端都没有解。
“方程有几行”不等于“有几个独立约束”。本例有三行,却只有两个独立方程。自由变量个数是 n−r,不是想当然的 n−m。
网络流量:左零空间关系与环路自由度
网络流量能把两类“隐藏关系”画得很直观。设一个有向网络有 v 个节点、e 条边。给每条边规定方向,并建立节点—边关联矩阵 B:
- 每一列对应一条边;
- 边的起点所在行记 −1;
- 边的终点所在行记 1;
- 其余位置记 0。
若
x∈Re
记录各边流量,那么
Bx=0
表示每个节点的“流入减流出”都为零。

节点守恒给出行约束,闭合环路上的循环流给出零空间方向。
为什么节点方程总有一条依赖
把所有节点的守恒方程相加,每条内部边都会出现一次 1 和一次 −1,正好抵消。因此
[11⋯1]
也就是
11⋮1
这条左零空间方向表达的是:全部节点的净流量之和必定为零。它不是额外假设,而是关联矩阵的列结构自动带来的关系。
对于一个连通网络,节点方程中恰有一条这样的整体依赖,因此
rank(B)=v−1
于是环路自由流的维数为
dimN(B)=e−rank(B)=e−v+1
图中的网络有 4 个节点和 5 条边,所以
rank(B)=3
dimN(B)=5−3=2
这意味着它有两条独立的环路流方向。沿任意一条闭合环路同时增减流量,不会在任何节点制造净积累,所以仍然满足 Bx=0。
下面的控件只演示外圈那一条环路方向。滑块改变环路流量时,四条外圈边同步变化,节点净流量始终为零。它展示的是零空间中的一条直线,不是说这个五边网络的整个零空间只有一维。控件内部用字母 A 表示关联矩阵,与这里的 B 只是命名不同。
常见误区:错在哪里,怎样自查
把四个空间放错一边
列空间由长度为 m 的列向量张成,所以住在 Rm;行空间由长度为 n 的行向量张成,所以住在 Rn。零空间中的 x 是输入,左零空间中的 与输出同长。
可以先在草稿上写:
C(A),N(AT)⊆Rm
C(AT),N(A)⊆Rn
如果你写出的基向量长度对不上所在空间,后面的计算不用继续,位置已经放错了。
直接拿 RREF 的主元列当列空间基
RREF 的主元列只负责告诉你列号。真正的列空间基必须从原矩阵取对应列。除非行变换碰巧没有改变列空间,否则 RREF 的列张成的是另一个子空间。
认为行空间必须取原矩阵的独立行
从原矩阵挑独立行当然可以,但往往不方便。行变换保持行空间不变,所以阶梯形的非零行天然就是一组基,而且独立性一眼可见。
把零化度写成行数减秩
零化度 dimN(A) 清点的是输入自由度,所以用列数:
dimN(A)=n−r
行数减秩对应的是左零空间维数:
dimN(AT)=m−r
只检查一个左零空间向量
如果左零空间是一维,检查一个非零基向量就够。本例正是这样。若左零空间维数为 m−r>1,必须对一整组基逐一检查
yiTb=0
少检查一条,就可能漏掉一个相容条件。
以为齐次方程有非零解就能保证非齐次方程有解
N(A) 决定相容方程有多少自由方向,却不决定给定 b 是否相容。先用列空间或左零空间判断有没有特解,再用零空间补齐全部解,顺序不能反。
练习
练习一:完整找出四个空间
设
M=101
求四个基本子空间的一组基,并核对它们的维数。
第三行等于前两行之和。把第三行减去前两行,得到一个零行,因此秩为 2。第 1、第 2 列可作主元列,列空间的一组基是原矩阵的对应列:
⎩
练习二:判断相容并写出全部解
沿用练习一的矩阵 M。判断
Mx=2−11
是否有解;若有,写出全部解。
左零空间由
y=−1−11
练习三:找出错误的取基方法
某矩阵行化简后得到
R=[10300
有人说:“列空间的一组基是 R 的第 1、第 3 列。”这句话哪里不完整?
第 1、第 3 列确实是主元列,但它们只告诉我们原矩阵中应该选哪两个列号。若问题问原矩阵 A 的列空间基,必须回到 A,取 A 的第 1、第 3 列。
行变换保持列之间的依赖关系,所以主元列号可靠;行变换一般会改变列向量本身,所以不能把 的列直接当作 的基。
练习四:只用尺寸和秩做维数账
设 A 是一个 5×8 矩阵,且
rank(A)=3
求四个基本子空间的维数。再说明 Ax=b 的相容右端需要满足多少个独立条件,以及每个相容方程组有多少个自由参数。
这里
m=5,n=8,r=3因此
dimC(A)=3
练习五:检查两对正交关系
对本章贯穿使用的矩阵,验证
v=−10−11
与行空间正交,并验证
y=−1−11
与列空间正交。
行空间基可取
u1=
练习六:网络中的自由环路
一个连通有向网络有 6 个节点、9 条边。设节点—边关联矩阵为 B。求 rank(B)、dimN(B) 和 。
连通网络的节点—边关联矩阵满足
rank(B)=v−1所以
rank(B)=6−1=5 有 列,因此
从四个空间走向线性变换
现在可以把这一章压缩成两句话。
第一句看输出。列空间告诉我们矩阵能到哪里,左零空间告诉我们所有可达输出必须遵守什么关系。
第二句看输入。零空间告诉我们矩阵忘掉哪些方向,行空间告诉我们它真正能分辨哪些方向。
对一个 m×n、秩为 r 的矩阵,这两侧各自严丝合缝:
Rn=C(AT)⊕N(A)
Rm=C(A)⊕N(AT)
下一章会正式把矩阵写成线性变换
T(x)=Ax
到那时,“值域”就是这里的列空间,“核”就是这里的零空间。我们也会进一步看到,矩阵怎样旋转、拉伸、投影或压扁整个空间。四个基本子空间已经先替我们回答了最关键的两个问题:这次变换最终能到哪里,又在途中忘掉了哪些方向。