笃行
首页
个人 & 心法
互联网/硬件后台
游戏基础架构
UE 引擎
游戏业务
AI / 大模型
数据结构与算法
机器学习数学
通用基础
GitHub
首页
个人 & 心法
互联网/硬件后台
游戏基础架构
UE 引擎
游戏业务
AI / 大模型
数据结构与算法
机器学习数学
通用基础
GitHub
  • 向量入门

    • 看得见的机器学习数学
    • 向量是什么
    • 向量的加减与数乘
    • 线性组合与张成
  • 矩阵与变换

    • 矩阵是一次变换
    • 矩阵乘法
  • 度量与求解

    • 行列式与面积
    • 解方程组就是倒着走回去
    • 特征向量的直觉
    • 点积与相似度
  • 高维与结构

    • 高维空间的直觉
    • 正交基与投影
    • 秩与低秩
    • 长度与归一化
    • 线性与非线性
  • 概率与信息

    • 概率分布与采样
    • 期望与方差
    • 指数与 softmax
    • 对数与信息量
    • 交叉熵
  • 学习与优化

    • 导数就是坡度
    • 梯度下降
    • 链式法则与反向传播

矩阵是一次变换:整张坐标纸被搬了家

有人趁你不在,把你的方格纸抓住两个角,狠狠一拉。格子还是格子,但全变斜了。你怎么用最少的字,告诉别人它被拉成了什么样?

🧠 一句话结论

矩阵不是一堆数字,它是"整张坐标纸被搬了一次家"这件事的记录。而记录方式简单到不可思议:只要写下两块底砖搬到哪儿去了。


场景问题

上一篇结尾我留了个问题:如果把基向量搬到别的地方去,会发生什么?

现在来认真对付它。

想象你的方格纸是块橡皮膜,上面画满了格子。有人抓住它拉了一把——纸被拉扯变形了,格子变斜了、变宽了,但格子还是格子:直线没变成曲线,平行线还是平行的,间距还是均匀的。

这种"讲道理的拉扯"就是这一篇的主角。问题是:怎么把这件事说清楚?

你可能想说"纸上每个点都动了,所以我得报告每个点搬到哪儿了"。但平面上有无穷多个点,报告不完。

真正的答案漂亮得多:你只需要说两件事。 而"两件事"写下来,就是一个矩阵。

实现方案

只需要盯住两块底砖

回忆上一篇最关键的那句话:

坐标 (32)\begin{pmatrix} 3 \\ 2 \end{pmatrix}(32​) 的意思是"3 个向右 + 2 个向上"。

现在请你想清楚这件事:这句话里,"3 个"和"2 个"这两个倍数是不会变的,会变的是"向右"和"向上"这两块底砖搬到了哪儿。

所以如果纸被拉扯了,某个点的新位置就是——

3 个"新的向右" + 2 个"新的向上"

倍数照抄,底砖换新。这就是全部的秘密。

于是要描述整张纸怎么变,你只需要报告两件事:

  1. "向右一格"这块底砖,被搬到哪儿去了?
  2. "向上一格"这块底砖,被搬到哪儿去了?

其余无穷多个点,全都能靠这两条推出来。

把两块底砖的新位置并排写下来,就是矩阵

假设拉扯之后:

  • "向右一格"(原来是 (10)\begin{pmatrix} 1 \\ 0 \end{pmatrix}(10​))落到了 (21)\begin{pmatrix} 2 \\ 1 \end{pmatrix}(21​)
  • "向上一格"(原来是 (01)\begin{pmatrix} 0 \\ 1 \end{pmatrix}(01​))落到了 (13)\begin{pmatrix} 1 \\ 3 \end{pmatrix}(13​)

把这两个落点并排竖着写,用括号一圈:

A=(2113)A = \begin{pmatrix} 2 & 1 \\ 1 & 3 \end{pmatrix} A=(21​13​)

这就是矩阵。 它一点也不神秘——

🔑 全篇最重要的一句话

矩阵的第一列 = 第一块底砖搬到哪儿了;第二列 = 第二块底砖搬到哪儿了。

(现在你也知道为什么第一篇说向量要"竖着写"了:竖着写,才能一列一列地并排塞进矩阵里。这个书写习惯是为了这一刻准备的。)

看图——左边是原来的纸,右边是被拉扯后的纸,注意那两根粗箭头搬到了哪儿:

向右向上变换前:规规矩矩新向右 (2,1)新向上 (1,3)变换后:全都变斜了

左右两边的倍数关系完全没变——右图里那些斜格子,每一格还是"一个新向右 + 一个新向上"。变的只是底砖本身。

算一算:一个点搬到哪儿去了

现在用这个矩阵,算 (32)\begin{pmatrix} 3 \\ 2 \end{pmatrix}(32​) 这个点搬到哪儿了。

按刚才那句话办:3 个"新向右" + 2 个"新向上"。

3⋅(21)+2⋅(13)=(63)+(26)=(89)3 \cdot \begin{pmatrix} 2 \\ 1 \end{pmatrix} + 2 \cdot \begin{pmatrix} 1 \\ 3 \end{pmatrix} = \begin{pmatrix} 6 \\ 3 \end{pmatrix} + \begin{pmatrix} 2 \\ 6 \end{pmatrix} = \begin{pmatrix} 8 \\ 9 \end{pmatrix} 3⋅(21​)+2⋅(13​)=(63​)+(26​)=(89​)

完事了。这就是矩阵作用在向量上的全过程,用的全是上一篇的数乘和加法,没有任何新东西。

写成标准格式是这样:

(2113)(32)=(89)\begin{pmatrix} 2 & 1 \\ 1 & 3 \end{pmatrix} \begin{pmatrix} 3 \\ 2 \end{pmatrix} = \begin{pmatrix} 8 \\ 9 \end{pmatrix} (21​13​)(32​)=(89​)

课本会教你一套"第一行乘第一列、横着乘竖着加"的口诀。那个口诀算出来的结果和这里一样,但它会让你忘记自己在干什么。请记住这个更好的说法:

拿倍数去分配那两块新底砖。

四种常见的搬家方式

矩阵长什么样,决定了纸被怎么折腾。看这四个例子——每一个你都可以自己验证"两列就是两块底砖的落点":

拉伸横向拉到 2 倍旋转逆时针转 90 度剪切上面被推向右边翻转左右照镜子

对应的矩阵(自己对着图核对一遍,很值得):

变换新的"向右"新的"向上"矩阵
拉伸(横向 2 倍)(20)\begin{pmatrix} 2 \\ 0 \end{pmatrix}(20​)(01)\begin{pmatrix} 0 \\ 1 \end{pmatrix}(01​) 没动(2001)\begin{pmatrix} 2 & 0 \\ 0 & 1 \end{pmatrix}(20​01​)
旋转(逆时针 90°)(01)\begin{pmatrix} 0 \\ 1 \end{pmatrix}(01​) 转到朝上(−10)\begin{pmatrix} -1 \\ 0 \end{pmatrix}(−10​) 转到朝左(0−110)\begin{pmatrix} 0 & -1 \\ 1 & 0 \end{pmatrix}(01​−10​)
剪切(10)\begin{pmatrix} 1 \\ 0 \end{pmatrix}(10​) 没动(11)\begin{pmatrix} 1 \\ 1 \end{pmatrix}(11​) 被推歪(1101)\begin{pmatrix} 1 & 1 \\ 0 & 1 \end{pmatrix}(10​11​)
翻转(左右镜像)(−10)\begin{pmatrix} -1 \\ 0 \end{pmatrix}(−10​) 掉头(01)\begin{pmatrix} 0 \\ 1 \end{pmatrix}(01​) 没动(−1001)\begin{pmatrix} -1 & 0 \\ 0 & 1 \end{pmatrix}(−10​01​)

"剪切"这个词听着专业,其实就是推一叠扑克牌的动作:底下那张不动,上面的越往上越往旁边挪。图上就是这个效果。

那么,什么都不做的矩阵长什么样?两块底砖都待在原地:

I=(1001)I = \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix} I=(10​01​)

这叫单位矩阵。它作用在任何向量上,那个向量一动不动。它就是矩阵世界里的"1"(任何数乘 1 都不变)。

反过来读:看着变形,写出矩阵

上面是"给矩阵,看变形"。反过来也必须会——给你变形,写出矩阵:

  1. 只盯住那两块底砖,别管其它点
  2. 看第一块(向右一格)落到了哪儿,把它的坐标竖着写成第一列
  3. 看第二块(向上一格)落到了哪儿,竖着写成第二列
  4. 写完了

比如有人告诉你"整张纸被压扁到横轴上了"——那"向右"还在原地 (10)\begin{pmatrix} 1 \\ 0 \end{pmatrix}(10​),"向上"被压到了原点 (00)\begin{pmatrix} 0 \\ 0 \end{pmatrix}(00​),所以矩阵是 (1000)\begin{pmatrix} 1 & 0 \\ 0 & 0 \end{pmatrix}(10​00​)。

(记住这个"被压扁"的矩阵,它在行列式和解方程组两篇里都是主角。)

"线性"到底是什么意思:三条看得见的判据

前面我一直说"讲道理的拉扯"。现在可以说准确了。一次变换是线性的,当且仅当它满足这三条——而且这三条全都是用眼睛就能看出来的:

判据说明违反的例子
直线还是直线原来是直的,变完还是直的,不许变弯把纸卷成筒,直线变成了曲线
平行且等距平行线还平行,格子间距还均匀像鱼眼镜头那样中间胀边上缩,格子疏密不一
原点不动中心那个点必须待在原地把整张纸往右平移 10 格,原点跑了

看动画,这是一次合法的线性变换——盯住格子:它们变斜了、变宽了,但始终是平行等距的直线,而中间那个点从头到尾没动过:

格子变斜了,但紫点(原点)从没动过紫点 = 原点,钉死在这儿

那第三条"原点不动"为什么这么重要?因为整个方法的根基是"倍数照抄、底砖换新"。如果连原点都跑了,那"从原点出发走几个底砖"这套说法就失效了——所有的落点都得额外再加一个偏移,矩阵就管不住了。

所以平移(整张纸挪个位置)不属于这里说的线性变换。这不是因为平移不重要,而是因为它超出了矩阵这个工具的射程。(游戏和图形学天天要做平移,他们的解决办法是耍个小聪明:多加一个维度,把平移伪装成高一维的线性变换。那是以后的故事了。)

为什么这么做

为什么只报告两块底砖就够了?凭什么?

凭那三条判据里的"平行且等距"。

因为格子必须保持平行等距,所以一旦你定下了两块底砖搬到哪儿,整张纸就没有任何自由发挥的空间了——第 3 格必须在第 1 格和第 2 格的延长线上,间距还得一样。每个点的位置都被两块底砖锁死了。

这就是"线性"给你的大礼:无穷多个点的信息,被压缩成了 4 个数字。要是允许纸被随便揉(非线性),那你就真的得逐点报告了。

为什么矩阵要竖着一列一列地摆,而不是横着一行一行?

因为一列就是一块底砖的落点,这是它的物理含义。竖着摆,矩阵的形状就直接对应"两个向量并排站",一眼能看出来。

也正因如此,向量要竖着写(列向量)——这样 Av⃗A\vec{v}Av 摆在一起时,v⃗\vec{v}v 里的每个数字正好对齐 AAA 的每一列,视觉上就是"这个倍数配这块底砖"。书写规矩是为了让含义看得见。

为什么不用"每个点移动了多少"来描述变换?

因为那样描述没法复用。你说"这个点往右上挪了 5 格",换个点就不适用了(离原点越远的点挪得越多)。而"底砖搬到哪儿"这个说法对所有点同时有效,一次说清。

为什么别的选择不行

死胡同一:把矩阵当成"一张表格,里面的数各自独立"

这是最要命的误解,因为矩阵长得确实很像表格。

试试这个:把 (2113)\begin{pmatrix} 2 & 1 \\ 1 & 3 \end{pmatrix}(21​13​) 左上角的 2 改成 5,会发生什么?

如果矩阵是表格,那应该"只有左上角那个格子的数变了"。但实际上:

  • 第一列从 (21)\begin{pmatrix} 2 \\ 1 \end{pmatrix}(21​) 变成了 (51)\begin{pmatrix} 5 \\ 1 \end{pmatrix}(51​),也就是"向右"这块底砖被搬到了一个新地方
  • 于是平面上除原点外的几乎每一个点,落点都变了——因为每个点的落点都要用到这块底砖

改一个数字,整张纸的变形方式就全变了。矩阵里的数不是各自独立的格子,它们合起来描述一件事。

打个比方:矩阵更像一个菜谱而不是一张账本。账本上改一个数,只影响那一笔;菜谱上把"盐 2 克"改成"盐 5 克",整锅菜的味道都变了。

(不过这个比方有个失效的地方:菜谱的步骤有先后,而矩阵的两列是同时生效的,没有先后。)

死胡同二:以为矩阵"只把那一个向量搬走了"

看到 Av⃗=w⃗A\vec{v} = \vec{w}Av=w,很容易理解成"矩阵 AAA 抓起 v⃗\vec{v}v,把它扔到了 w⃗\vec{w}w",好像其它点都在旁边看着。

不是这样。 AAA 一发动,整个平面上每一个点同时被搬走了。你写 Av⃗A\vec{v}Av 只是因为你恰好关心 v⃗\vec{v}v 这个点,就像你在洪水里只盯着自己家的船——但整条河都在动。

为什么这个区别重要?因为下一篇讲"连做两次变换"时,你必须把变换想成对整个平面的操作,才能理解为什么两次变换能合并成一次。如果你以为它只搬一个向量,那"合并"就说不通了。

死胡同三:以为"把纸挪个位置"也是线性变换

平移感觉是最简单、最无害的操作了——不拉不扯,整张纸端起来往右挪 3 格。怎么就不算线性变换了?

因为原点跑了。

具体后果是这样:线性变换的核心公式是"新位置 = 倍数分配给新底砖"。零向量 (00)\begin{pmatrix} 0 \\ 0 \end{pmatrix}(00​) 的倍数都是 0,所以它算出来的新位置必然还是 (00)\begin{pmatrix} 0 \\ 0 \end{pmatrix}(00​)。任何矩阵都把原点留在原地——这是矩阵这个工具的硬性限制。

而平移偏偏要把原点挪走。所以无论你怎么挑那 4 个数字,没有任何一个 2×2 矩阵能表示"往右挪 3 格"。不是你没找到,是它不存在。

这个死胡同的教训比它本身更重要:每个数学工具都有射程。 矩阵管得住拉伸旋转剪切翻转,管不住平移。承认工具的边界,比假装它无所不能有用得多。

沉淀结论

这一篇是整个专栏的枢纽,请务必把这几条带走:

  1. 矩阵 = 一次变换的记录,不是一张数字表格
  2. 矩阵的每一列 = 一块底砖搬到哪儿了(第一列管"向右",第二列管"向上")——这是全篇的钥匙
  3. 算法就是"倍数照抄、底砖换新":(32)\begin{pmatrix} 3 \\ 2 \end{pmatrix}(32​) 变成"3 个新向右 + 2 个新向上"
  4. 双向都要会:给矩阵能说出纸怎么变,给纸怎么变能写出矩阵
  5. 线性的三条可视判据:直线还是直线、平行且等距、原点不动
  6. 单位矩阵 III 什么都不做;平移不是线性变换(原点会跑)

下一篇:如果先做一次变换、再做一次变换,会发生什么?答案是这两次能合并成一次——而合并的操作就叫"矩阵乘法"。你还会看到一件有点反常识的事:做的顺序不能换。

记忆口诀

矩阵不是表格,是搬家记录。
第一列管向右,第二列管向上——两块底砖落在哪,就写在哪。
算点就一句:倍数照抄,底砖换新。
线性三条:线还是线、平行等距、原点不动。
改一个数,整张纸都变;平移搬走原点,矩阵管不了。

长大以后它会变成什么

你现在理解的这件事,就是所有 3D 游戏画面的底层原理:角色的旋转、镜头的缩放、模型的形变,全是矩阵在搬网格,每秒搬几十次。想看真实引擎里的样子,可以以后翻 UE 引擎架构。


自测:合上资料能说清楚吗?

  1. 有人给你矩阵 (3001)\begin{pmatrix} 3 & 0 \\ 0 & 1 \end{pmatrix}(30​01​),问整张纸被怎么折腾了。你怎么读出来?
参考答案

读两列:第一列 (30)\begin{pmatrix} 3 \\ 0 \end{pmatrix}(30​) 说明"向右"这块底砖被拉长到 3 倍;第二列 (01)\begin{pmatrix} 0 \\ 1 \end{pmatrix}(01​) 说明"向上"没动。所以整张纸被横向拉长到 3 倍,竖向不变。

  1. 用 (2103)\begin{pmatrix} 2 & 1 \\ 0 & 3 \end{pmatrix}(20​13​) 算 (12)\begin{pmatrix} 1 \\ 2 \end{pmatrix}(12​) 搬到了哪儿。别用课本的行列口诀,用"倍数照抄、底砖换新"来算。
参考答案

1 个新向右 + 2 个新向上 = 1(20)+2(13)=(20)+(26)=(46)1\begin{pmatrix} 2 \\ 0 \end{pmatrix} + 2\begin{pmatrix} 1 \\ 3 \end{pmatrix} = \begin{pmatrix} 2 \\ 0 \end{pmatrix} + \begin{pmatrix} 2 \\ 6 \end{pmatrix} = \begin{pmatrix} 4 \\ 6 \end{pmatrix}1(20​)+2(13​)=(20​)+(26​)=(46​)。倍数(1 和 2)照抄,底砖换成矩阵的两列。

  1. 把一个矩阵左上角的数字改一改,是不是"只有那一个位置受影响"?为什么?
参考答案

不是。 改左上角就等于把"向右"这块底砖搬到了新地方,而平面上每个点的落点都要用到这块底砖,所以除原点外几乎所有点的落点都变了。矩阵像菜谱不像账本——改一味料,整锅菜的味道都变。

  1. 为什么"把整张纸往右挪 3 格"没法用任何 2×2 矩阵表示?
参考答案

因为任何矩阵都把原点留在原地——零向量的倍数全是 0,算出来必然还落在原点。而平移偏要把原点挪走,违反了线性三条判据里的"原点不动"。所以这样的矩阵不存在,不是没找到。

  1. 对比"拉伸"和"剪切"这两种变换:两块底砖各自的遭遇有什么不同?
参考答案

拉伸(如 (2001)\begin{pmatrix} 2 & 0 \\ 0 & 1 \end{pmatrix}(20​01​)):底砖只被拉长或缩短,方向都没变。剪切(如 (1101)\begin{pmatrix} 1 & 1 \\ 0 & 1 \end{pmatrix}(10​11​)):一块底砖完全不动,另一块被推歪了方向——就像推一叠扑克牌,底下那张不动,上面的越往上越往旁边挪。

最近更新: 2026/9/10 11:38
Next
矩阵乘法