矩阵是一次变换:整张坐标纸被搬了家
有人趁你不在,把你的方格纸抓住两个角,狠狠一拉。格子还是格子,但全变斜了。你怎么用最少的字,告诉别人它被拉成了什么样?
🧠 一句话结论
矩阵不是一堆数字,它是"整张坐标纸被搬了一次家"这件事的记录。而记录方式简单到不可思议:只要写下两块底砖搬到哪儿去了。
场景问题
上一篇结尾我留了个问题:如果把基向量搬到别的地方去,会发生什么?
现在来认真对付它。
想象你的方格纸是块橡皮膜,上面画满了格子。有人抓住它拉了一把——纸被拉扯变形了,格子变斜了、变宽了,但格子还是格子:直线没变成曲线,平行线还是平行的,间距还是均匀的。
这种"讲道理的拉扯"就是这一篇的主角。问题是:怎么把这件事说清楚?
你可能想说"纸上每个点都动了,所以我得报告每个点搬到哪儿了"。但平面上有无穷多个点,报告不完。
真正的答案漂亮得多:你只需要说两件事。 而"两件事"写下来,就是一个矩阵。
实现方案
只需要盯住两块底砖
回忆上一篇最关键的那句话:
坐标 的意思是"3 个向右 + 2 个向上"。
现在请你想清楚这件事:这句话里,"3 个"和"2 个"这两个倍数是不会变的,会变的是"向右"和"向上"这两块底砖搬到了哪儿。
所以如果纸被拉扯了,某个点的新位置就是——
3 个"新的向右" + 2 个"新的向上"
倍数照抄,底砖换新。这就是全部的秘密。
于是要描述整张纸怎么变,你只需要报告两件事:
- "向右一格"这块底砖,被搬到哪儿去了?
- "向上一格"这块底砖,被搬到哪儿去了?
其余无穷多个点,全都能靠这两条推出来。
把两块底砖的新位置并排写下来,就是矩阵
假设拉扯之后:
- "向右一格"(原来是 )落到了
- "向上一格"(原来是 )落到了
把这两个落点并排竖着写,用括号一圈:
这就是矩阵。 它一点也不神秘——
🔑 全篇最重要的一句话
矩阵的第一列 = 第一块底砖搬到哪儿了;第二列 = 第二块底砖搬到哪儿了。
(现在你也知道为什么第一篇说向量要"竖着写"了:竖着写,才能一列一列地并排塞进矩阵里。这个书写习惯是为了这一刻准备的。)
看图——左边是原来的纸,右边是被拉扯后的纸,注意那两根粗箭头搬到了哪儿:
左右两边的倍数关系完全没变——右图里那些斜格子,每一格还是"一个新向右 + 一个新向上"。变的只是底砖本身。
算一算:一个点搬到哪儿去了
现在用这个矩阵,算 这个点搬到哪儿了。
按刚才那句话办:3 个"新向右" + 2 个"新向上"。
完事了。这就是矩阵作用在向量上的全过程,用的全是上一篇的数乘和加法,没有任何新东西。
写成标准格式是这样:
课本会教你一套"第一行乘第一列、横着乘竖着加"的口诀。那个口诀算出来的结果和这里一样,但它会让你忘记自己在干什么。请记住这个更好的说法:
拿倍数去分配那两块新底砖。
四种常见的搬家方式
矩阵长什么样,决定了纸被怎么折腾。看这四个例子——每一个你都可以自己验证"两列就是两块底砖的落点":
对应的矩阵(自己对着图核对一遍,很值得):
| 变换 | 新的"向右" | 新的"向上" | 矩阵 |
|---|---|---|---|
| 拉伸(横向 2 倍) | 没动 | ||
| 旋转(逆时针 90°) | 转到朝上 | 转到朝左 | |
| 剪切 | 没动 | 被推歪 | |
| 翻转(左右镜像) | 掉头 | 没动 |
"剪切"这个词听着专业,其实就是推一叠扑克牌的动作:底下那张不动,上面的越往上越往旁边挪。图上就是这个效果。
那么,什么都不做的矩阵长什么样?两块底砖都待在原地:
这叫单位矩阵。它作用在任何向量上,那个向量一动不动。它就是矩阵世界里的"1"(任何数乘 1 都不变)。
反过来读:看着变形,写出矩阵
上面是"给矩阵,看变形"。反过来也必须会——给你变形,写出矩阵:
- 只盯住那两块底砖,别管其它点
- 看第一块(向右一格)落到了哪儿,把它的坐标竖着写成第一列
- 看第二块(向上一格)落到了哪儿,竖着写成第二列
- 写完了
比如有人告诉你"整张纸被压扁到横轴上了"——那"向右"还在原地 ,"向上"被压到了原点 ,所以矩阵是 。
(记住这个"被压扁"的矩阵,它在行列式和解方程组两篇里都是主角。)
"线性"到底是什么意思:三条看得见的判据
前面我一直说"讲道理的拉扯"。现在可以说准确了。一次变换是线性的,当且仅当它满足这三条——而且这三条全都是用眼睛就能看出来的:
| 判据 | 说明 | 违反的例子 |
|---|---|---|
| 直线还是直线 | 原来是直的,变完还是直的,不许变弯 | 把纸卷成筒,直线变成了曲线 |
| 平行且等距 | 平行线还平行,格子间距还均匀 | 像鱼眼镜头那样中间胀边上缩,格子疏密不一 |
| 原点不动 | 中心那个点必须待在原地 | 把整张纸往右平移 10 格,原点跑了 |
看动画,这是一次合法的线性变换——盯住格子:它们变斜了、变宽了,但始终是平行等距的直线,而中间那个点从头到尾没动过:
那第三条"原点不动"为什么这么重要?因为整个方法的根基是"倍数照抄、底砖换新"。如果连原点都跑了,那"从原点出发走几个底砖"这套说法就失效了——所有的落点都得额外再加一个偏移,矩阵就管不住了。
所以平移(整张纸挪个位置)不属于这里说的线性变换。这不是因为平移不重要,而是因为它超出了矩阵这个工具的射程。(游戏和图形学天天要做平移,他们的解决办法是耍个小聪明:多加一个维度,把平移伪装成高一维的线性变换。那是以后的故事了。)
为什么这么做
为什么只报告两块底砖就够了?凭什么?
凭那三条判据里的"平行且等距"。
因为格子必须保持平行等距,所以一旦你定下了两块底砖搬到哪儿,整张纸就没有任何自由发挥的空间了——第 3 格必须在第 1 格和第 2 格的延长线上,间距还得一样。每个点的位置都被两块底砖锁死了。
这就是"线性"给你的大礼:无穷多个点的信息,被压缩成了 4 个数字。要是允许纸被随便揉(非线性),那你就真的得逐点报告了。
为什么矩阵要竖着一列一列地摆,而不是横着一行一行?
因为一列就是一块底砖的落点,这是它的物理含义。竖着摆,矩阵的形状就直接对应"两个向量并排站",一眼能看出来。
也正因如此,向量要竖着写(列向量)——这样 摆在一起时, 里的每个数字正好对齐 的每一列,视觉上就是"这个倍数配这块底砖"。书写规矩是为了让含义看得见。
为什么不用"每个点移动了多少"来描述变换?
因为那样描述没法复用。你说"这个点往右上挪了 5 格",换个点就不适用了(离原点越远的点挪得越多)。而"底砖搬到哪儿"这个说法对所有点同时有效,一次说清。
为什么别的选择不行
死胡同一:把矩阵当成"一张表格,里面的数各自独立"
这是最要命的误解,因为矩阵长得确实很像表格。
试试这个:把 左上角的 2 改成 5,会发生什么?
如果矩阵是表格,那应该"只有左上角那个格子的数变了"。但实际上:
- 第一列从 变成了 ,也就是"向右"这块底砖被搬到了一个新地方
- 于是平面上除原点外的几乎每一个点,落点都变了——因为每个点的落点都要用到这块底砖
改一个数字,整张纸的变形方式就全变了。矩阵里的数不是各自独立的格子,它们合起来描述一件事。
打个比方:矩阵更像一个菜谱而不是一张账本。账本上改一个数,只影响那一笔;菜谱上把"盐 2 克"改成"盐 5 克",整锅菜的味道都变了。
(不过这个比方有个失效的地方:菜谱的步骤有先后,而矩阵的两列是同时生效的,没有先后。)
死胡同二:以为矩阵"只把那一个向量搬走了"
看到 ,很容易理解成"矩阵 抓起 ,把它扔到了 ",好像其它点都在旁边看着。
不是这样。 一发动,整个平面上每一个点同时被搬走了。你写 只是因为你恰好关心 这个点,就像你在洪水里只盯着自己家的船——但整条河都在动。
为什么这个区别重要?因为下一篇讲"连做两次变换"时,你必须把变换想成对整个平面的操作,才能理解为什么两次变换能合并成一次。如果你以为它只搬一个向量,那"合并"就说不通了。
死胡同三:以为"把纸挪个位置"也是线性变换
平移感觉是最简单、最无害的操作了——不拉不扯,整张纸端起来往右挪 3 格。怎么就不算线性变换了?
因为原点跑了。
具体后果是这样:线性变换的核心公式是"新位置 = 倍数分配给新底砖"。零向量 的倍数都是 0,所以它算出来的新位置必然还是 。任何矩阵都把原点留在原地——这是矩阵这个工具的硬性限制。
而平移偏偏要把原点挪走。所以无论你怎么挑那 4 个数字,没有任何一个 2×2 矩阵能表示"往右挪 3 格"。不是你没找到,是它不存在。
这个死胡同的教训比它本身更重要:每个数学工具都有射程。 矩阵管得住拉伸旋转剪切翻转,管不住平移。承认工具的边界,比假装它无所不能有用得多。
沉淀结论
这一篇是整个专栏的枢纽,请务必把这几条带走:
- 矩阵 = 一次变换的记录,不是一张数字表格
- 矩阵的每一列 = 一块底砖搬到哪儿了(第一列管"向右",第二列管"向上")——这是全篇的钥匙
- 算法就是"倍数照抄、底砖换新": 变成"3 个新向右 + 2 个新向上"
- 双向都要会:给矩阵能说出纸怎么变,给纸怎么变能写出矩阵
- 线性的三条可视判据:直线还是直线、平行且等距、原点不动
- 单位矩阵 什么都不做;平移不是线性变换(原点会跑)
下一篇:如果先做一次变换、再做一次变换,会发生什么?答案是这两次能合并成一次——而合并的操作就叫"矩阵乘法"。你还会看到一件有点反常识的事:做的顺序不能换。
记忆口诀
矩阵不是表格,是搬家记录。
第一列管向右,第二列管向上——两块底砖落在哪,就写在哪。
算点就一句:倍数照抄,底砖换新。
线性三条:线还是线、平行等距、原点不动。
改一个数,整张纸都变;平移搬走原点,矩阵管不了。
长大以后它会变成什么
你现在理解的这件事,就是所有 3D 游戏画面的底层原理:角色的旋转、镜头的缩放、模型的形变,全是矩阵在搬网格,每秒搬几十次。想看真实引擎里的样子,可以以后翻 UE 引擎架构。
自测:合上资料能说清楚吗?
- 有人给你矩阵 ,问整张纸被怎么折腾了。你怎么读出来?
参考答案
读两列:第一列 说明"向右"这块底砖被拉长到 3 倍;第二列 说明"向上"没动。所以整张纸被横向拉长到 3 倍,竖向不变。
- 用 算 搬到了哪儿。别用课本的行列口诀,用"倍数照抄、底砖换新"来算。
参考答案
1 个新向右 + 2 个新向上 = 。倍数(1 和 2)照抄,底砖换成矩阵的两列。
- 把一个矩阵左上角的数字改一改,是不是"只有那一个位置受影响"?为什么?
参考答案
不是。 改左上角就等于把"向右"这块底砖搬到了新地方,而平面上每个点的落点都要用到这块底砖,所以除原点外几乎所有点的落点都变了。矩阵像菜谱不像账本——改一味料,整锅菜的味道都变。
- 为什么"把整张纸往右挪 3 格"没法用任何 2×2 矩阵表示?
参考答案
因为任何矩阵都把原点留在原地——零向量的倍数全是 0,算出来必然还落在原点。而平移偏要把原点挪走,违反了线性三条判据里的"原点不动"。所以这样的矩阵不存在,不是没找到。
- 对比"拉伸"和"剪切"这两种变换:两块底砖各自的遭遇有什么不同?
参考答案
拉伸(如 ):底砖只被拉长或缩短,方向都没变。剪切(如 ):一块底砖完全不动,另一块被推歪了方向——就像推一叠扑克牌,底下那张不动,上面的越往上越往旁边挪。