深入理解:矩阵变换的几何意义

用矩阵描述一张地图旋转 90∘90^\circ

假设你正在开发一个地图或游戏系统。

地图上有一个玩家,原来的坐标是:

P=(2,3)P=(2,3)

现在,我们把整个地图逆时针旋转 90∘90^\circ。

我们的问题是:

玩家旋转之后的坐标是多少?为什么旋转矩阵的两列,就可以决定整个地图的变化?


第一步:先别管玩家,观察坐标系

把地图想象成一张坐标纸。

在二维坐标系中,我们有两个最基本的方向:

  • 向右走一步:
i=[10]\mathbf{i} = \begin{bmatrix} 1\\ 0 \end{bmatrix}
  • 向上走一步:
j=[01]\mathbf{j} = \begin{bmatrix} 0\\ 1 \end{bmatrix}

玩家的位置 (2,3)(2,3),其实并不神秘。

它真正表达的是:

P=2i+3jP=2\mathbf{i}+3\mathbf{j}

也就是说:

从原点出发,沿着 i\mathbf{i} 方向走 22 步,再沿着 j\mathbf{j} 方向走 33 步。

因此:

[23]=2[10]+3[01]\begin{bmatrix} 2\\ 3 \end{bmatrix} = 2 \begin{bmatrix} 1\\ 0 \end{bmatrix} + 3 \begin{bmatrix} 0\\ 1 \end{bmatrix}

第二步:把整个地图逆时针旋转 90∘90^\circ

现在,我们把整个坐标系逆时针旋转 90∘90^\circ。

这时候,我们其实不需要观察地图上的每一个点。

只需要观察两个最基本的方向。

问题 1:原来的向右方向去哪了?

原来的

i=[10]\mathbf{i} = \begin{bmatrix} 1\\ 0 \end{bmatrix}

逆时针旋转 90∘90^\circ 后变成:

i′=[01]\mathbf{i}' = \begin{bmatrix} 0\\ 1 \end{bmatrix}

也就是:

i⟶[01]\boxed{ \mathbf{i} \longrightarrow \begin{bmatrix} 0\\ 1 \end{bmatrix} }

问题 2:原来的向上方向去哪了?

原来的

j=[01]\mathbf{j} = \begin{bmatrix} 0\\ 1 \end{bmatrix}

逆时针旋转 90∘90^\circ 后变成:

j′=[−10]\mathbf{j}' = \begin{bmatrix} -1\\ 0 \end{bmatrix}

也就是:

j⟶[−10]\boxed{ \mathbf{j} \longrightarrow \begin{bmatrix} -1\\ 0 \end{bmatrix} }

第三步:由两个基向量的落点构造矩阵

现在关键来了。

我们已经知道:

i⟶[01]\mathbf{i} \longrightarrow \begin{bmatrix} 0\\ 1 \end{bmatrix}

以及:

j⟶[−10]\mathbf{j} \longrightarrow \begin{bmatrix} -1\\ 0 \end{bmatrix}

那么,把这两个变换后的基向量按列放进矩阵:

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

也就是:

R=[[01]⏟i 的新位置[−10]⏟j 的新位置]\boxed{ R= \left[ \underbrace{ \begin{bmatrix} 0\\ 1 \end{bmatrix} }_{\mathbf{i}\text{ 的新位置}} \quad \underbrace{ \begin{bmatrix} -1\\ 0 \end{bmatrix} }_{\mathbf{j}\text{ 的新位置}} \right] }

这就是逆时针旋转 90∘90^\circ 的矩阵。

为什么可以这样构造?

因为矩阵的第 11 列就是:

Ri=[01]R\mathbf{i} = \begin{bmatrix} 0\\ 1 \end{bmatrix}

也就是:

原来的 i\mathbf{i} 经过变换后去了哪里。

而矩阵的第 22 列就是:

Rj=[−10]R\mathbf{j} = \begin{bmatrix} -1\\ 0 \end{bmatrix}

也就是:

原来的 j\mathbf{j} 经过变换后去了哪里。

所以:

矩阵的每一列=对应基向量经过变换后的落点\boxed{ \text{矩阵的每一列} = \text{对应基向量经过变换后的落点} }

矩阵并不是凭空出现的。

它其实只是在记录:

“坐标系最基本的两个方向,经过这个变换以后分别去了哪里。”


第四步:现在再处理玩家

玩家原来的位置是:

P=2i+3jP=2\mathbf{i}+3\mathbf{j}

旋转以后,由于旋转是一个线性变换,所以:

R(P)=R(2i+3j)R(P) = R(2\mathbf{i}+3\mathbf{j})

利用线性变换的性质:

R(P)=2R(i)+3R(j)R(P) = 2R(\mathbf{i})+3R(\mathbf{j})

我们已经知道:

R(i)=[01]R(\mathbf{i}) = \begin{bmatrix} 0\\ 1 \end{bmatrix}

以及:

R(j)=[−10]R(\mathbf{j}) = \begin{bmatrix} -1\\ 0 \end{bmatrix}

因此:

R(P)=2[01]+3[−10]R(P) = 2 \begin{bmatrix} 0\\ 1 \end{bmatrix} + 3 \begin{bmatrix} -1\\ 0 \end{bmatrix}

分别计算:

=[02]+[−30]= \begin{bmatrix} 0\\ 2 \end{bmatrix} + \begin{bmatrix} -3\\ 0 \end{bmatrix}

最终得到:

R(P)=[−32]\boxed{ R(P) = \begin{bmatrix} -3\\ 2 \end{bmatrix} }

所以玩家的坐标从:

(2,3)\boxed{(2,3)}

变成:

(−3,2)\boxed{(-3,2)}

第五步:为什么只知道两个基向量,就能决定整个地图?

这其实是整个例子最重要的地方。

玩家原来的位置:

P=2i+3jP=2\mathbf{i}+3\mathbf{j}

本质上是由两个基向量组合出来的。

如果我们知道:

i→i′\mathbf{i}\rightarrow\mathbf{i}'

以及:

j→j′\mathbf{j}\rightarrow\mathbf{j}'

那么玩家自然就会变成:

P=2i+3jP = 2\mathbf{i}+3\mathbf{j}

经过变换:

⇓\DownarrowP′=2i′+3j′P' = 2\mathbf{i}'+3\mathbf{j}'

也就是说:

我们不需要知道地图上无数个点分别怎么移动。

只需要知道两个基向量怎么移动,所有点的变化就都确定了。

例如:

(5,2)=5i+2j(5,2)=5\mathbf{i}+2\mathbf{j}

旋转之后:

(5,2)⟶5[01]+2[−10]=[−25](5,2) \longrightarrow 5 \begin{bmatrix} 0\\ 1 \end{bmatrix} + 2 \begin{bmatrix} -1\\ 0 \end{bmatrix} = \begin{bmatrix} -2\\ 5 \end{bmatrix}

同样地:

(−1,4)=−i+4j(-1,4) = -\mathbf{i}+4\mathbf{j}

旋转之后:

(−1,4)⟶−[01]+4[−10]=[−4−1](-1,4) \longrightarrow -\begin{bmatrix} 0\\ 1 \end{bmatrix} + 4 \begin{bmatrix} -1\\ 0 \end{bmatrix} = \begin{bmatrix} -4\\ -1 \end{bmatrix}

你会发现,所有点都遵循同一个规则。


最核心的理解

所以以后看到一个矩阵:

A=[abcd]A= \begin{bmatrix} a & b\\ c & d \end{bmatrix}

不要只是把它看成“四个数字”。

应该把它看成:

A=[[ac][bd]]A= \left[ \begin{array}{c|c} \begin{bmatrix} a\\ c \end{bmatrix} & \begin{bmatrix} b\\ d \end{bmatrix} \end{array} \right]

其中:

[ac]\begin{bmatrix} a\\ c \end{bmatrix}

是第一个基向量 i\mathbf{i} 经过变换后的落点,

而:

[bd]\begin{bmatrix} b\\ d \end{bmatrix}

是第二个基向量 j\mathbf{j} 经过变换后的落点。

对于任意向量:

x=[x1x2⋮xn]\mathbf{x} = \begin{bmatrix} x_1\\ x_2\\ \vdots\\ x_n \end{bmatrix}

假设矩阵 AA 的列向量为:

A=[a1a2⋯an]A= \begin{bmatrix} \mathbf{a}_1 & \mathbf{a}_2 & \cdots & \mathbf{a}_n \end{bmatrix}

那么矩阵乘法:

AxA\mathbf{x}

本质上就是用向量 x\mathbf{x} 中的各个分量作为权重,对矩阵的各列进行线性组合:

Ax=x1a1+x2a2+⋯+xnan\boxed{ A\mathbf{x} = x_1\mathbf{a}_1 + x_2\mathbf{a}_2 + \cdots + x_n\mathbf{a}_n }

也就是说:

向量 x\mathbf{x} 中的 xix_i,表示第 ii 个基向量在原坐标系中的权重;而矩阵的第 ii 列 ai\mathbf{a}_i,则是第 ii 个基向量经过线性变换后的新位置。