Lumina.
线性代数 · 第二幕 · 第 5 关

矩阵是变换

第 4 关里,矩阵只是一张系数表。这一关,它会变成别的东西。

① 问题

只用几个数,记下一张图的任意变形?

你在做一个小游戏,主角是这张笑脸。美术给了几十种变形:拉宽、压扁、倾斜、旋转、翻面……每一种都存一整张图,太浪费了。

这些变形有个共同点:都是「均匀」的,整张图各处变得一样。那么,能不能只用几个数,就把任意一种这样的变形记下来?

先猜一下:最少需要几个数?

任务:

拖动绿色和橙色箭头的端点。

回头看:你刚才一共动了什么?

只动了两个箭头的端点。每个端点是一个点,有 2 个坐标,所以一共 4 个数。可整张笑脸、整片网格都跟着变了。

这很奇怪:为什么两个箭头就能决定整张图的样子?平面上有无数个点,凭什么只看 $\mathbf{i}$、$\mathbf{j}$ 这两个就够了?

② 定义

什么样的变形,能被两个箭头决定?

再拖一拖下面的箭头,盯着网格看:原点动过吗?直线有没有弯?平行的线还平行吗?间距还相等吗?

选一个向量 $\mathbf{v}$,看它被送到哪里:

当前矩阵

定义(线性变换) 平面的一种变形,如果满足:原点不动;网格线变形后仍是直线,而且仍然平行、等距,就叫线性变换。

用式子说:对任意向量 $\mathbf{u},\mathbf{v}$ 和数 $a,b$,$\;T(a\mathbf{u}+b\mathbf{v}) = a\,T(\mathbf{u}) + b\,T(\mathbf{v})$。

关键在这里:任何向量都能拆成 $\begin{pmatrix}x\\y\end{pmatrix} = x\,\mathbf{i} + y\,\mathbf{j}$。线性变换保持这种「几份加几份」的关系,所以

$T\begin{pmatrix}x\\y\end{pmatrix} = x\,T(\mathbf{i}) + y\,T(\mathbf{j})$

只要知道 $\mathbf{i}$、$\mathbf{j}$ 去了哪里,其他每个点去哪里都定了。这就是两个箭头够用的原因。

定义(矩阵) 把 $T(\mathbf{i})$、$T(\mathbf{j})$ 竖着并排写在一起,就是这个变换的矩阵:

$A = \begin{pmatrix} a & b \\ c & d \end{pmatrix},\quad \text{第一列 } \begin{pmatrix}a\\c\end{pmatrix} = T(\mathbf{i}),\ \ \text{第二列 } \begin{pmatrix}b\\d\end{pmatrix} = T(\mathbf{j})$

矩阵乘向量就是「$x$ 份第一列 + $y$ 份第二列」:$\;A\begin{pmatrix}x\\y\end{pmatrix} = x\begin{pmatrix}a\\c\end{pmatrix} + y\begin{pmatrix}b\\d\end{pmatrix} = \begin{pmatrix}ax+by\\cx+dy\end{pmatrix}$

第 4 关里你见过的那张「系数表」,和这里的矩阵是同一个东西。同一张表,两种读法。

练一下:不画图,直接算。
结果 = ( , )
③ 用定义解题

回到最初的问题:直接写出 4 个数

这次不拖了。先想「$\mathbf{i}$ 该去哪?$\mathbf{j}$ 该去哪?」,再把答案写成两列。

你刚才用的方法:把「这张图要怎么变」翻译成「$\mathbf{i}$、$\mathbf{j}$ 要去哪」,然后写成两列。整个问题就是这样被定义解决的。

一开始的「最少几个数」,答案是 4 个:均匀的变形(线性变换)和 $2\times 2$ 矩阵一一对应。

④ 延展

这套定义和方法,还能解决什么?

旋转任意角度

任务:转 θ 角的矩阵,四个数分别是什么?用 $\cos\theta$、$\sin\theta$ 写出来。

提示:$\mathbf{i}$ 转 θ 后落在单位圆上的哪一点?$\mathbf{j}$ 呢?

$\mathbf{i}$ 转到 $(\cos\theta,\ \sin\theta)$,$\mathbf{j}$ 转到 $(-\sin\theta,\ \cos\theta)$,所以 $\;R_\theta = \begin{pmatrix}\cos\theta & -\sin\theta \\ \sin\theta & \cos\theta\end{pmatrix}$。你不需要背它,因为随时能用「$\mathbf{i}$、$\mathbf{j}$ 去哪」推出来。

同一个方法,到处都在用

游戏与动画

屏幕上每个物体的旋转、缩放、翻转,都是一个矩阵乘在它所有顶点上。显卡每秒做几十亿次这样的乘法。

三维空间

三维里有 $\mathbf{i},\mathbf{j},\mathbf{k}$ 三个箭头,所以是 $3\times 3$ 矩阵,三列是它们的去向。想法完全一样。

回看第 1 关的方程组

解 $A\mathbf{x}=\mathbf{b}$,换个读法就是问:哪个向量被 $A$ 送到了 $\mathbf{b}$?有时无解、有时无穷多解,第 7 关会从这个角度看清原因。

迁移:电脑上的「斜体字」其实是把正体字做了一个线性变换:底边不动,越往上越向右偏。写出一个能把字变成斜体的矩阵。
⑤ 边界

什么时候,这套方法用不了?

知道一个工具的边界,才算真的懂它。下面三个变形,看看矩阵能不能做到。

1. 把笑脸往右平移 2 格

试试看:拖动箭头,让笑脸和虚线轮廓重合。

做不到。不管矩阵是什么,$A\begin{pmatrix}0\\0\end{pmatrix} = 0\cdot T(\mathbf{i}) + 0\cdot T(\mathbf{j}) = \begin{pmatrix}0\\0\end{pmatrix}$:原点永远不动。而平移恰恰要把原点也挪走。

以后会看到一个巧妙的办法:多加一维,用 $3\times 3$ 矩阵来表示平面上的平移(齐次坐标)。游戏引擎就是这么做的。

2. 把笑脸弯成波浪

能用一个矩阵做到吗?

不能。线性变换要求网格线变形后还是直线,还要平行、等距。波浪把直线弄弯了,所以它不是线性变换,任何 4 个数都描述不了。描述弯曲的变形需要别的工具(以后的「非线性」与微积分里的「局部看起来是线性的」)。

3. 把笑脸压成一条线,再变回来

这个矩阵把整个平面压到了一条线上:
能找到另一个矩阵,把笑脸恢复原样吗?

不能。压扁之后,很多不同的点落在了同一个点上(比如 $(2,0)$ 和 $(0,1)$ 都到了 $(2,1)$)。一个点不可能再同时变回两个点,信息丢了。什么时候能「撤销」、怎么一眼看出会不会被压扁,是第 7 关(逆矩阵)和第 8 关(行列式)要回答的问题。

自己讲一遍

用一两句你自己的话说:矩阵到底是什么?它什么时候管用,什么时候不管用?

留给下一关的问题

先用矩阵 $A$ 变一次,再用矩阵 $B$ 变一次。结果还是一个线性变换吗?如果是,它的 4 个数是多少?先做 $A$ 再做 $B$,和先做 $B$ 再做 $A$,一样吗?

第 6 关:矩阵乘法(筹备中)