把矩阵看作变换

从向量的组合到秩,以及矩阵会丢掉什么

线性代数
发布于

2026年10月15日

本文译自英文原文 Matrices as Transformations,如有出入,以英文版为准。

1 从向量的组合到矩阵

前面我们讨论了向量的一些基本概念和运算。现在,我们从三个向量开始:

\[ \vec{u}= \begin{bmatrix}1\\-1\\0\end{bmatrix}, \quad \vec{v}= \begin{bmatrix}0\\1\\-1\end{bmatrix}, \quad \vec{w}= \begin{bmatrix}0\\0\\1\end{bmatrix} \]

假设我们分别用 \(x_1\)、\(x_2\)、\(x_3\) 去缩放这三个向量,再把它们加起来:

\[ \begin{aligned} x_1\vec{u}+x_2\vec{v}+x_3\vec{w} &= x_1\begin{bmatrix}1\\-1\\0\end{bmatrix} +x_2\begin{bmatrix}0\\1\\-1\end{bmatrix} +x_3\begin{bmatrix}0\\0\\1\end{bmatrix}\\ &= \begin{bmatrix} x_1\\ x_2-x_1\\ x_3-x_2 \end{bmatrix} \end{aligned} \]

这很好理解。我们有三个向量,可以用不同的数去乘它们,把它们拉长、缩短,甚至反向。最后把它们加起来,得到一个新的向量(图 1)。

图 1: 用三个向量组合出 \(\vec{b}\)。 缩放后的向量 \(x_1\vec{u}\)、\(x_2\vec{v}\)、\(x_3\vec{w}\) 都从原点出发,浅色虚线是 \(\vec{u}\)、\(\vec{v}\)、\(\vec{w}\) 本身。点线补出平行四边形:先得到 \(x_1\vec{u}+x_2\vec{v}\),再加上 \(x_3\vec{w}\) 就得到 \(\vec{b}\),它的坐标标在旁边。移动滑块可以改变 \(x_1\)、\(x_2\)、\(x_3\),拖动图形可以换个角度看。

但我们可以把这个式子写得更简洁:

\[ \underbrace{ \begin{bmatrix} 1&0&0\\ -1&1&0\\ 0&-1&1 \end{bmatrix}}_A \underbrace{ \begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix}}_{\vec{x}} = \underbrace{ \begin{bmatrix} x_1\\ x_2-x_1\\ x_3-x_2 \end{bmatrix}}_{\vec{b}} \]

或者干脆写成:

\[ A\vec{x}=\vec{b} \]

这个式子虽然看起来更简单,但我觉得它带来了一个非常有意思的视角转换。

之前,\(x_1\)、\(x_2\)、\(x_3\) 只是用来缩放向量的三个系数。现在,我们把这三个数合成了一个新的向量 \(\vec{x}\)。

从这个角度看,矩阵 \(A\) 对输入向量 \(\vec{x}\) 做了一次线性变换。之所以叫“线性”,是因为它和向量的两种基本运算相容:\(A(\vec{x}+\vec{y})=A\vec{x}+A\vec{y}\),\(A(c\vec{x})=cA\vec{x}\)。先对输入做加法或数乘再变换,和先变换再做加法或数乘,结果一样。

我们可以直接观察这个变换:

\[ \begin{aligned} x_1&\longrightarrow x_1\\ x_2&\longrightarrow x_2-x_1\\ x_3&\longrightarrow x_3-x_2 \end{aligned} \]

也就是说,原来的向量 \((x_1,x_2,x_3)\) 被变换成了另一个向量。图 2 展示了整个空间同时被变换的过程。

图 2: 把矩阵看作变换。 点击“播放”,观察 \(A\) 如何变换空间。\(\vec{e}_1\)、\(\vec{e}_2\)、\(\vec{e}_3\) 是沿坐标轴的单位向量,单位立方体随它们一起变换:这三条棱变成了三列 \(\vec{u}\)、\(\vec{v}\)、\(\vec{w}\)。输入 \(\vec{x}=(1,0.5,1.5)\),也就是 \(1\vec{e}_1+0.5\vec{e}_2+1.5\vec{e}_3\),变成了 \(1\vec{u}+0.5\vec{v}+1.5\vec{w}=\vec{b}\),和 图 1 中的向量相同。这就是两种视角一致的原因。

对于任意给定的输入 \(\vec{x}\),我们都可以作用矩阵 \(A\),得到对应的输出 \(\vec{b}\)。

其实,这两种视角描述的是完全相同的数学运算。

一种视角把矩阵与向量的乘法看作矩阵各列的线性组合,另一种把它看作作用在输入向量上的线性变换。

\(A\vec{x}\) 还有第三种读法,也是我们手算时通常用的方法:\(\vec{b}\) 的每一个分量,都是 \(A\) 的某一行与 \(\vec{x}\) 的点积。\(A\) 的第二行是 \((-1,1,0)\),而 \((-1,1,0)\cdot(x_1,x_2,x_3)=x_2-x_1\),正好是 \(\vec{b}\) 的第二个分量。所以,上一篇里的点积其实藏在每一次矩阵乘法里。

正是从这里,我开始从几何的角度理解矩阵:矩阵不只是一堆数,它还可以表示空间中的一个线性变换。

2 把矩阵看作线性变换

如果矩阵表示一个线性变换,就会自然地产生一个问题:作用这个变换之后,空间里的向量到底发生了什么?

我们不只看一个向量,而是看一整组向量。

假设输入向量 \(\vec{x}\) 可以取三维空间中的任意值。作用矩阵 \(A\) 之后,这些向量会构成一个什么样的集合?

或者把问题问得更具体一些。

假设所有输入向量都限制在三维单位球内:

\[ x_1^2+x_2^2+x_3^2\leq1 \]

经过一次线性变换,这个球会变成什么?

它会被拉伸成一个椭球吗?会被压到一个二维平面上,变成一个椭圆盘吗?甚至会坍缩成一条线段或一个点吗?

这些都有可能。1 图 3 在低一维的情形下展示了同样的想法:球变成了圆盘,它的像可以是一个椭圆、一条线段,或者一个点。

1 线性变换能产生什么形状? 我一开始的想法是,线性变换几乎可以把一个球变成任意形状,比如立方体或长方体。和 AI 一起探索时,它指出这是做不到的:球在线性变换下只能变成椭球,或者椭球的某种退化形式,比如椭圆盘、线段或一个点。要把球变成立方体,需要非线性变换。为什么会有这个限制,我还没有研究过,留到以后。

uv
图 3: 二维中的矩阵。 矩阵 \(A\) 的两列是 \(\vec{u}\) 和 \(\vec{v}\)。拖动它们的端点,或者选一个例子。网格显示整个平面被变到了哪里,单位圆变成实线的曲线,阴影部分的单位正方形变成一个平行四边形,面积为 \(|\det A|\)。当 \(\vec{u}\) 和 \(\vec{v}\) 落在同一条直线上时,整个平面就被压到这条直线上。

我觉得这个视角特别有意思。我们不再只研究一个向量怎么变化,而是研究一整组向量是怎样被变换的。

从这个角度看,矩阵可以描述各种线性变换,比如拉伸、压缩、旋转、反射和投影。

我们还可以研究在这些变换中,哪些性质被保留了下来,比如向量的长度、向量之间的夹角,以及变换后空间的维数。

2.1 线性变换的几个例子

先看一个简单的例子:单位矩阵。

\[ I= \begin{bmatrix} 1&0&0\\ 0&1&0\\ 0&0&1 \end{bmatrix} \]

对任意向量:

\[ I\vec{x}=\vec{x} \]

它不改变输入向量的任何坐标。原来的向量是什么,变换之后还是什么。

再看另外两个矩阵:

\[ P_1= \begin{bmatrix} 1&0&0\\ 0&0&0\\ 0&0&0 \end{bmatrix} \]

\[ P_2= \begin{bmatrix} 1&0&0\\ 0&1&0\\ 0&0&0 \end{bmatrix} \]

它们的变换是:

\[ P_1 \begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix} = \begin{bmatrix}x_1\\0\\0\end{bmatrix} \]

\[ P_2 \begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix} = \begin{bmatrix}x_1\\x_2\\0\end{bmatrix} \]

图 4 展示了这些矩阵对单位球做了什么。

图 4: 各个矩阵对单位球的作用。 本节各个矩阵作用下的单位球和单位向量 \(\vec{e}_1\)、\(\vec{e}_2\)、\(\vec{e}_3\)。选一个矩阵观察变换过程,拖动图形可以旋转视角。

第一个矩阵只保留 \(x_1\) 坐标,去掉了另外两个坐标。

如果原来的输入集合是一个三维的球,变换后的集合会完全落在 \(x_1\) 轴上,成为一条线段。

第二个矩阵保留 \(x_1\) 和 \(x_2\),去掉了 \(x_3\)。

同一个三维的球会变成 \(x_1x_2\) 平面上的一个圆盘。

换句话说,这些矩阵降低了原集合的维数,丢掉了一部分信息。

如果我们修改矩阵的某些元素,比如把 \(P_2\) 的一个非零对角元从 1 改成 2,得到的圆盘就会变成椭圆盘(图 4 中的第四个例子)。

如果一个矩阵保留全部三个坐标,只是按不同的比例缩放它们,又会怎样?例如:

\[ S= \begin{bmatrix} 1.5&0&0\\ 0&1&0\\ 0&0&0.5 \end{bmatrix} \]

它的变换是:

\[ S \begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix} = \begin{bmatrix}1.5x_1\\x_2\\0.5x_3\end{bmatrix} \]

在 图 4 中选 \(S\):球沿 \(x_1\) 轴被拉长、沿 \(x_3\) 轴被压扁,变成一个椭球。和 \(P_1\)、\(P_2\) 不同,\(S\) 没有去掉任何坐标,所以结果仍然是三维的,也没有丢失信息。

再看另一个矩阵:

\[ R= \begin{bmatrix} 1&0&0\\ 0&0&-1\\ 0&1&0 \end{bmatrix} \]

它做的变换是:

\[ R\begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix} = \begin{bmatrix}x_1\\-x_3\\x_2\end{bmatrix} \]

这个变换有一个有意思的性质。

它不改变向量的长度:

\[ \begin{aligned} \|R\vec{x}\|^2 &=x_1^2+(-x_3)^2+x_2^2\\ &=x_1^2+x_2^2+x_3^2\\ &=\|\vec{x}\|^2 \end{aligned} \]

从几何上看,这个矩阵表示绕 \(x_1\) 轴旋转 \(90^\circ\)。在 图 4 中选 \(R\):球看起来没变,但箭头显示它已经转过去了。

我们还可以算出它的行列式:2

2 行列式、旋转与缩放。 一开始我以为,所有行列式为 1 的矩阵都表示旋转。AI 指出并不是这样。行列式描述的是有向面积或体积的缩放倍数,而不是向量长度的缩放倍数。保持所有向量长度不变的条件是 \[ A^TA=I \] 满足这个条件的矩阵叫作正交矩阵。AI 还告诉我,把一个矩阵拆成旋转、反射以及沿不同方向的缩放,和奇异值分解(SVD) \(A=U\Sigma V^T\) 有关。这些我都还没有学过,先留在这里,以后再探索。

\[ \det(R)=1 \]

2.2 关于神经网络和计算的一点想法

把矩阵理解为线性变换,也让我想到了神经网络。

如果暂时忽略非线性的部分,神经网络中的很多计算都可以理解为:用大量参数对输入数据依次施加一系列线性变换。

当然,真正的神经网络要复杂得多。我们暂时忽略了偏置项、激活函数和许多其他结构。

但从这个高度简化的视角,我们可以想象一个输入经过一连串矩阵运算,产生新的表示,最后得到输出。

不过,这个简化里有一个陷阱。接连作用几个矩阵,本身也只是一个矩阵:\(W_3(W_2(W_1\vec{x}))=(W_3W_2W_1)\vec{x}\)。3没有非线性的部分,一百层能做到的事,一层也能做到,而且它们仍然只能把球变成椭球。层与层之间的非线性激活函数,才让网络能把空间弯成更复杂的形状,这和注 1 里把球变成立方体的问题是同一个问题。4

3 变换是唯一的吗? 有一天下楼的时候,我想到一个问题。假设一个线性变换把 \(\vec{a}\) 变成 \(\vec{b}\),它可能是一个矩阵 \(A\),也可能是几个矩阵 \(B\)、\(C\)、\(D\),那么 \(BCD=A\)。我最初的想法是:如果 \(A\) 可逆,这个变换就一定是唯一的;如果 \(A\) 不可逆,它就不一定唯一。AI 指出我把两个问题混在了一起。单独一对 \(\vec{a}\)、\(\vec{b}\) 永远确定不了一个矩阵:\(A\) 有 \(n^2\) 个未知数,而 \(A\vec{a}=\vec{b}\) 只给出 \(n\) 个方程。要确定 \(A\),需要很多对数据。把输入作为 \(X\) 的列、输出作为 \(Y\) 的列,那么当且仅当 \(X\) 的秩为 \(n\) 时,\(AX=Y\) 才有唯一解。所以需要可逆的是数据,而不是 \(A\)。而且即使 \(A\) 唯一,它的分解也不唯一,因为对任意可逆矩阵 \(M\),都有 \(BCD=(BM)(M^{-1}C)D\)。

4 把训练看作寻找变换。 接着我想到,神经网络做的是同样的事,只不过用的是线性加非线性的变换,所以训练就是在寻找这样一个变换。我原以为全连接网络不管参数多大都只是线性变换,后来的网络加了一些非线性但效果一般,而 Transformer 成功是因为它的非线性让拟合程度大大提高。AI 指出,带激活函数的全连接网络本身就是非线性的;有一个叫万能逼近定理的结果说,这样的网络只要足够宽,就能在有界区域上逼近任何连续函数。它还告诉我,训练数据上的拟合程度不是正确的衡量标准,因为一张查找表就能完美拟合;真正重要的是泛化能力,也就是网络在从没见过的输入上表现如何。它还告诉我,Transformer 主要改变了两点:它的注意力机制根据输入本身算出混合矩阵;它能在长序列上并行训练,这让巨大的规模成为可能。AI 也补充说,这只是常见的解释,并没有被证明:这些模型为什么泛化得这么好,目前还没有被很好地理解,而且在相近的规模下,一些其他结构的效果也相差不远。

所以按我现在的理解,问题是这样的:给定海量的数据对 \((\vec{a}_i,\vec{b}_i)\),选定一个函数族,在其中寻找一个 \(f\),让输出 \(f(\vec{a}_i)\) 接近 \(\vec{b}_i\),并且这种效果能推广到新的输入上。这些我都还没有学过,先记在这里。

这也让我想到,为什么 GPU 特别适合做这些计算。

矩阵乘法包含大量可以并行执行的乘加运算,而 GPU 正是为高效地进行大规模并行计算而设计的。5

5 关于物理矩阵乘法器的一个想法。 我还有一个有意思的想法:如果某些物理规律天然就在做加法或线性叠加,我们能不能造一个直接做矩阵乘法的物理装置,而不完全依赖传统的数字逻辑电路?比如,能不能利用电流、电压、光,或者材料的某些物理性质,通过物理过程来完成计算?

后来我了解到,相关的方法已经存在,比如模拟计算、光计算和忆阻器交叉阵列架构。在忆阻器交叉阵列里,这个想法几乎是字面意义上的:每个交叉点存储一个电导 \(G\),欧姆定律 \(I=GV\) 完成乘法,基尔霍夫电流定律把流进每根导线的电流加起来。

不过,即使某些物理操作可以大规模并行地完成,也不意味着任意规模的矩阵乘法都能达到 \(O(1)\) 复杂度。硬件规模、输入输出的开销、数值精度和数据搬运仍然很重要。

这个想法有点偏离本文的主题,所以以后可能单独探索。

3 从正向变换到逆问题

现在回到最初的方程:

\[ A\vec{x}=\vec{b} \]

到目前为止,我们都假设 \(\vec{x}\) 已知,任务是算出 \(\vec{b}\)。

我们已经讨论了两种视角。

第一种是:已知三个向量 \(\vec{u}\)、\(\vec{v}\)、\(\vec{w}\) 和三个系数 \(x_1\)、\(x_2\)、\(x_3\),计算它们的线性组合。

第二种是:已知输入向量 \(\vec{x}\),对它施加矩阵 \(A\) 所表示的线性变换,得到输出向量 \(\vec{b}\)。

这两种视角虽然不同,得到的结果却完全一样。

现在,我们把问题反过来。

假设矩阵 \(A\) 已知,输出向量 \(\vec{b}\) 也已知。我们能还原出原来的输入向量 \(\vec{x}\) 吗?

从线性组合的角度,我们问的是:

应该怎样组合 \(\vec{u}\)、\(\vec{v}\)、\(\vec{w}\),才能得到一个指定的向量 \(\vec{b}\)?

从线性变换的角度,我们问的是:

如果知道变换和它的输出,能不能还原出原来的输入?

对于可逆矩阵,我们可以写成:

\[ \vec{x}=A^{-1}\vec{b} \]

但 \(A^{-1}\) 到底是什么?

回到前面的例子:

\[ \begin{bmatrix} 1&0&0\\ -1&1&0\\ 0&-1&1 \end{bmatrix} \begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix} = \begin{bmatrix}b_1\\b_2\\b_3\end{bmatrix} \]

可以把它展开成一个方程组:

\[ \begin{cases} x_1=b_1\\ x_2-x_1=b_2\\ x_3-x_2=b_3 \end{cases} \]

然后解出原来的变量:

\[ \begin{cases} x_1=b_1\\ x_2=b_1+b_2\\ x_3=b_1+b_2+b_3 \end{cases} \]

再把这些方程写成矩阵形式:

\[ \begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix} = \underbrace{ \begin{bmatrix} 1&0&0\\ 1&1&0\\ 1&1&1 \end{bmatrix}}_{A^{-1}} \begin{bmatrix}b_1\\b_2\\b_3\end{bmatrix} \]

所以逆矩阵是:6

6 看看这两个矩阵各自做了什么。\(A\) 求相邻分量的差,\(A^{-1}\) 求累加和:\(x_3=b_1+b_2+b_3\)。求和抵消了求差,就像积分抵消了求导,这一对矩阵就是它的一个小小的离散版本。

\[ A^{-1}= \begin{bmatrix} 1&0&0\\ 1&1&0\\ 1&1&1 \end{bmatrix} \]

这意味着,对于任意给定的输出向量 \(\vec{b}\),我们都能找到唯一一个对应的输入向量 \(\vec{x}\)。

所以,矩阵 \(A\) 是可逆的。

但是,是不是每个矩阵都有这个性质?

4 线性相关与线性无关

我们把原来的矩阵稍微改一下。

保持 \(\vec{u}\) 和 \(\vec{v}\) 不变,把第三个向量换成:

\[ \vec{w}^*= \begin{bmatrix}-1\\0\\1\end{bmatrix} \]

现在得到一个新的矩阵:

\[ C= \begin{bmatrix} 1&0&-1\\ -1&1&0\\ 0&-1&1 \end{bmatrix} \]

变换变成了:

\[ C\vec{x}= \begin{bmatrix} x_1-x_3\\ x_2-x_1\\ x_3-x_2 \end{bmatrix} = \begin{bmatrix}b_1\\b_2\\b_3\end{bmatrix} \]

我们试着解这个方程:

\[ \begin{cases} x_1-x_3=b_1\\ x_2-x_1=b_2\\ x_3-x_2=b_3 \end{cases} \]

如果把三个方程加起来,有意思的事情发生了。

所有 \(x\) 项都抵消了:

\[ 0=b_1+b_2+b_3 \]

因此:

\[ b_1+b_2+b_3=0 \]

这意味着什么?

首先,无论选择什么输入向量 \(\vec{x}\),变换的输出都必须满足这个条件。

从几何上看,满足这个方程的所有向量都落在三维空间中的一个平面上:

\[ b_1+b_2+b_3=0 \]

换句话说,虽然原来的输入向量可以充满整个三维空间,但作用 \(C\) 之后,它们的输出被限制在一个二维平面上(图 5)。

图 5: \(C\) 把空间压到一个平面上。 27 个输入向量组成的网格占满了空间中的一个立方体。点击“播放”,用 \(C\) 变换它们:所有输出都落在平面 \(b_1+b_2+b_3=0\) 上,这个平面随着点的到达逐渐显现;切换到侧面视角会看得更清楚,平面和所有的点都缩成了一条线。切换到 \(A\) 作对比:它的输出充满整个空间,没有哪个平面能装下它们。

我们丢掉了一个维度。

4.1 丢掉的那个维度去哪了?

考虑一个特殊情况:

\[ \vec{b}= \begin{bmatrix}0\\0\\0\end{bmatrix} \]

方程变成:

\[ \begin{cases} x_1-x_3=0\\ x_2-x_1=0\\ x_3-x_2=0 \end{cases} \]

因此:

\[ x_1=x_2=x_3=c \]

其中 \(c\) 可以是任意实数。

这意味着,所有形如

\[ \vec{x}= c\begin{bmatrix}1\\1\\1\end{bmatrix} \]

的向量,都会被变换成零向量:

\[ C\begin{bmatrix}c\\c\\c\end{bmatrix} = \begin{bmatrix}0\\0\\0\end{bmatrix} \]

从几何上看,这些向量都落在一条经过原点、方向为 \((1,1,1)\) 的直线上。

整条直线被压缩成了一个点:原点。

这是不是意味着,沿这个方向的所有信息都被抹掉了?

其实,还有更有意思的事情。

对任意输入向量 \(\vec{x}\),假设我们沿 \((1,1,1)\) 方向加上任意的量:

\[ \vec{x}'= \vec{x} +c\begin{bmatrix}1\\1\\1\end{bmatrix} \]

那么:

\[ C\vec{x}'=C\vec{x} \]

即使两个输入向量不同,它们的输出也完全一样。

矩阵 \(C\) 已经无法区分这些输入了。这也是为什么在 图 5 中,27 个不同的输入只得到 19 个不同的输出。

这给了信息丢失一个几何上的解释:不同的输入被映射到同一个输出,所以原来的输入再也无法被唯一地还原。

在这个例子里,三维的输入空间被映射到了一个二维的输出平面上。

有意思的是,被抹掉的方向正好垂直于输出平面(图 6)。7

7 丢掉的方向与输出平面。 我原以为被抹掉的方向总是垂直于输出平面。AI 指出一般并非如此:矩阵的零空间和像空间不一定互相垂直,这里只是恰好如此。我还不明白其中的原因,留到以后。

4.2 看看矩阵的列

现在回到矩阵 \(C\) 本身。

它的三个列向量是:

\[ \vec{u}= \begin{bmatrix}1\\-1\\0\end{bmatrix}, \quad \vec{v}= \begin{bmatrix}0\\1\\-1\end{bmatrix}, \quad \vec{w}^*= \begin{bmatrix}-1\\0\\1\end{bmatrix} \]

我们马上可以注意到:

\[ \vec{u}+\vec{v}+\vec{w}^*=\vec{0} \]

或者:

\[ \vec{w}^*=-\vec{u}-\vec{v} \]

第三个向量可以表示成前两个向量的线性组合。

这意味着,虽然我们有三个向量,但只有两个独立的方向。

前两个向量已经张成了一个二维平面,而第三个向量恰好落在同一个平面上(图 6)。

图 6: \(C\) 和 \(A\) 的列。 \(C\) 的三列都落在平面 \(b_1+b_2+b_3=0\) 上,两两之间夹角为 \(120^\circ\),加起来等于 \(\vec{0}\);在侧面视角下,三者都在一条线上。虚线是方向 \((1,1,1)\),\(C\) 把它变成 \(\vec{0}\)。严格地说,它是一个输入方向,而平面上放的是输出,但两者都在三维空间里,所以可以画在一起。切换到 \(A\) 的列:\(\vec{w}\) 伸出了平面,虚线从它的端点垂直落到平面上。

因此,无论怎样缩放和组合这三个向量,我们都只能得到这个平面上的向量,得不到平面外的任何向量。

这就是线性相关。

相比之下,最初的三个向量 \(\vec{u}\)、\(\vec{v}\)、\(\vec{w}\) 是线性无关的(把 图 6 切换到 \(A\))。

在那个例子里,第三个向量不在前两个向量张成的平面上,它引入了一个新的独立方向。

这三个向量合在一起,可以张成整个三维空间。

但在矩阵 \(C\) 中,第三个向量没有提供新的独立方向。

结果,它的各列只能张成一个二维平面。

5 秩与维数

从前面的例子,我们可以开始理解一个非常重要的概念:秩。

对于一个矩阵,我们可以问:它的列向量张成了多少维?

考虑最初的矩阵:

\[ A= \begin{bmatrix} 1&0&0\\ -1&1&0\\ 0&-1&1 \end{bmatrix} \]

它的三个列向量线性无关,张成了整个三维空间。

因此:

\[ \operatorname{rank}(A)=3 \]

再考虑修改后的矩阵:

\[ C= \begin{bmatrix} 1&0&-1\\ -1&1&0\\ 0&-1&1 \end{bmatrix} \]

它的三个列向量线性相关,只张成了一个二维平面。

因此:

\[ \operatorname{rank}(C)=2 \]

从线性变换的角度看,秩告诉我们输出空间里有多少个独立方向,也就是变换所能到达的空间的维数。

对于从三维空间到三维空间的变换:

  • 秩为 3,意味着输出可以充满整个三维空间。
  • 秩为 2,意味着输出被限制在一个二维平面上。
  • 秩为 1,意味着输出落在一条直线上。
  • 秩为 0,意味着每个输入都被变换成零向量。

所以,我们可以把秩看作线性变换的输出中保留下来的独立维数。

当然,这里说的是整个输出空间的维数,而不是表示单个向量所用的坐标个数。8

8 秩–零化度定理。 AI 告诉我,我们在 \(C\) 上看到的现象,即二维的输出加上一个被抹掉的输入方向,是一个一般定理的特例: \[ \operatorname{rank}(A)+\operatorname{nullity}(A)=n \] 其中 \(n\) 是输入空间的维数,零化度是被映射为零的那些输入所构成的子空间的维数。这个定理我还没有学。

6 秩、线性相关与可逆性

现在,我们可以把几个起初看起来毫不相干的概念联系起来了。

对于最初的矩阵 \(A\),三个列向量线性无关。它的秩是 3,各列张成了整个三维空间。

因此,对于任意给定的 \(\vec{b}\),都有且只有一个解:

\[ \vec{x}=A^{-1}\vec{b} \]

这意味着 \(A\) 是可逆的。

但矩阵 \(C\) 的情况不一样。

它的三个列向量线性相关,秩只有 2。

于是,我们会遇到两种可能的情况。

第一种情况:无解。

如果给定的输出向量 \(\vec{b}\) 不满足

\[ b_1+b_2+b_3=0 \]

它就不在三个列向量张成的平面上。

无论怎样选择 \(x_1\)、\(x_2\)、\(x_3\),它们的线性组合都得不到这个向量。

因此,方程无解。

第二种情况:无穷多个解。

如果给定的输出向量 \(\vec{b}\) 落在这个平面上,我们就能找到一个对应的输入。

但是,因为三个列向量线性相关,第三个向量可以表示成前两个的组合。

这意味着,同一个输出可以由无穷多种不同的系数组合得到。

例如,对任意满足 \(b_1+b_2+b_3=0\) 的 \(\vec{b}\),我们可以取:

\[ \begin{aligned} x_1&=t\\ x_2&=t+b_2\\ x_3&=t-b_1 \end{aligned} \]

其中 \(t\) 可以是任意实数。

改变 \(t\),就得到无穷多个不同的输入向量 \(\vec{x}\),它们产生完全相同的输出 \(\vec{b}\)。

这些解有一个熟悉的形状。写成向量,

\[ \vec{x}= \begin{bmatrix}0\\b_2\\-b_1\end{bmatrix} +t\begin{bmatrix}1\\1\\1\end{bmatrix}, \]

它们是一个特解,加上 \(C\) 映射为零的那条直线上的任意一点,也就是前面找到的那条直线。所有的解彼此之间只在被抹掉的方向上有差别。图 7 把两种情况放在了同一幅图里。

图 7: 多个输入,同一个输出。 直线 \((0,0,-1)+t(1,1,1)\) 上的五个输入,用空心圆标出。点击“播放”:\(C\) 把它们全都送到 \(\vec{b}=(1,0,-1)\),而 \(\vec{b}'=(0,1,1)\) 没有任何输入能到达;从 \(\vec{b}'\) 落到平面的虚线表明它在平面之外。切换到 \(A\):同样的五个输入被送到五个不同的输出。

这就解释了为什么矩阵 \(C\) 不可逆。

一个维度的信息丢失了。即使知道输出,我们也无法唯一地确定原来的输入。

从这个角度看,线性相关、秩和可逆性是紧密相连的。它们描述的是同一个根本问题的不同侧面。

线性相关告诉我们,矩阵的列向量里是否包含多余的方向。

秩告诉我们,这些列向量能张成多少维。

可逆性告诉我们,能否从变换的输出唯一地还原出原来的输入。

对于一个 \(3\times3\) 矩阵,如果它的三个列向量线性无关,那么它的秩是 3,矩阵可逆。

如果三个列向量线性相关,那么它的秩小于 3,矩阵不可逆。

我们还可以用行列式来判断一个方阵是否可逆:

\[ \det(A)\neq0 \quad\Longleftrightarrow\quad A\text{ 可逆} \]

如果

\[ \det(A)=0 \]

那么这个矩阵没有通常意义上的逆。

对于我们的两个例子,\(\det(A)=1\)(三角矩阵的行列式等于对角元的乘积),而 \(\det(C)=0\)。

事实上,对于可逆方阵,我们有:

\[ A^{-1}=\frac{\operatorname{adj}(A)}{\det(A)} \]

其中 \(\operatorname{adj}(A)\) 是伴随矩阵。

如果行列式为零,这个公式的分母就是零,所以无法用这个式子求出逆矩阵。

但不可逆更深层的几何原因,正是我们前面讨论过的:变换把不同的输入映射到同一个输出,因此无法唯一地还原出原来的输入。

行列式也符合这幅图景。正如注 2 所说,行列式是一个变换对体积的缩放倍数。\(C\) 把整个三维空间压扁到一个平面上,而任何扁平的东西体积都是零,所以 \(\det(C)\) 必然为零。行列式为零并不是一条单独的规则,它就是同一次坍缩,只不过是用体积来衡量。在 图 3 里可以亲眼看到这一点:当两列逐渐对齐时,阴影平行四边形越来越细,面积趋于零。

这是我重新学习线性代数时慢慢意识到的。

许多起初看起来毫不相关的概念,比如矩阵、线性组合、线性相关、秩、行列式和逆矩阵,其实都可以从线性变换这个统一的几何视角来理解。

当我们不再只关注怎样计算公式,而是试着去理解在变换中向量和整个空间发生了什么时,这些概念之间的联系就清楚多了。