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

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

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

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

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

现在,我们把整个地图逆时针旋转 9090^\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}

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

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

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

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

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

原来的

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

逆时针旋转 9090^\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}

逆时针旋转 9090^\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=[0110]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] }

这就是逆时针旋转 9090^\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}

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

如果我们知道:

ii\mathbf{i}\rightarrow\mathbf{i}'

以及:

jj\mathbf{j}\rightarrow\mathbf{j}'

那么玩家自然就会变成:

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

经过变换:

\DownarrowP=2i+3jP' = 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]=[41](-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=[x1x2xn]\mathbf{x} = \begin{bmatrix} x_1\\ x_2\\ \vdots\\ x_n \end{bmatrix}

假设矩阵 AA 的列向量为:

A=[a1a2an]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 个基向量在原坐标系中的权重;而矩阵的第 iiai\mathbf{a}_i,则是第 ii 个基向量经过线性变换后的新位置。