Linear Transformation 线性变换

Linear Transformation 线性变换 从几何直观上看指的是向量的 运动过程,这种在空间中的“运动”或“映射”的过程就像用手在空间中把一个向量箭头推到了另一个位置。

代数上可以把这个过程理解为:用函数 TT 表示一个线性变换(Linear Transformation)过程,矩阵 AA 可以看作一台线性变换的"变换机器",即表示 输入一个向量,输出一个新的向量 的动作:

xTT(x)\mathbf x \xrightarrow{\quad T\quad} T(\mathbf x)

如果这个线性变换 TT 可以用矩阵 AA 表示,那么:

T(x)=AxT(\mathbf x)=A\mathbf x

注意:不是所有的“输入→输出”都叫线性变换

“输入 → 输出”只说明这里有一个函数或映射,并不能说明它是线性的。所谓线性,是指这台“变换机器”不会破坏向量之间原有的线性组合关系:先把输入相加再变换,和先分别变换再相加,结果相同;输入乘一个倍数,输出也只会跟着乘同一个倍数。

严格地说,任意向量 u,v\mathbf u,\mathbf v 和标量 cc 都要满足:

T(u+v)=T(u)+T(v)T(\mathbf u+\mathbf v)=T(\mathbf u)+T(\mathbf v)T(cu)=cT(u)T(c\mathbf u)=cT(\mathbf u)

把这两条合在一起,也可以写成保持线性组合的形式:

T(c1u+c2v)=c1T(u)+c2T(v)T(c_1\mathbf u+c_2\mathbf v)=c_1T(\mathbf u)+c_2T(\mathbf v)

因此,线性变换一定会把零向量送到零向量:T(0)=0T(\mathbf 0)=\mathbf 0。例如,旋转、缩放、投影都满足这些规则,所以可以用矩阵乘法表示。相反,平移

T(x)=Ax+b(b0)T(\mathbf x)=A\mathbf x+\mathbf b\quad(\mathbf b\ne\mathbf 0)

虽然也是一种“输入 → 输出”的变换,但它会把原点移到 b\mathbf b,不再满足 T(0)=0T(\mathbf 0)=\mathbf 0,所以叫 Affine Transformation 仿射变换,而不是线性变换。类似地,T(x)=x2T(x)=x^2 也会破坏加法关系,因此不是线性变换。

概念:用 Ax = y 描述线性变换的过程

Ax=yA\mathbf x=\mathbf y

这个式子描述的是一个正向过程:输入向量 x\mathbf x 经过矩阵 AA 表示的线性变换,得到输出向量 y\mathbf y。它只是把

T(x)=AxT(\mathbf x)=A\mathbf x

中的变换结果另外记作 y\mathbf y

  • AA:变换的规则(变换机器);
  • x\mathbf x:输入向量(Input);
  • y\mathbf y:输出向量(Output),也就是向量 x\mathbf x 在线性变换下的Image 像

补充:Ax = b

Ax=bA\mathbf x=\mathbf b

这里通常不是要计算输出,而是已经给定目标输出 b\mathbf b,反过来寻找输入 x\mathbf x。因此它是线性方程组的逆向求解问题,详细内容见 Linear Equations 线性方程组;从变换角度看,这是寻找 b\mathbf bPreimage 原像

观点:描述 Ax=yA\mathbf x = \mathbf y 的行、列视角

两种视角描述的是同一个矩阵乘法:一个偏向几何上的“合成”,一个偏向代数上的“计算”。

  • 列向量视角:矩阵的列记录了定义域标准基向量经过变换后的像,把输入的各个分量当作权重,合成输出向量;
  • 行向量视角:分别计算输入与矩阵每一行的点积,得到输出的各个分量,所有分量合在一起就是输出向量。

列向量视角:输出是基向量像的组合

ARm×nA\in\mathbb R^{m\times n},输入 xRn\mathbf x\in\mathbb R^n,输出 yRm\mathbf y\in\mathbb R^m。把 AA 按列写成:

A=[a1 a2  an]A=[\mathbf a_1\ \mathbf a_2\ \cdots\ \mathbf a_n]

先把输入向量按定义域的标准基展开:

x=x1e1+x2e2++xnen\mathbf x=x_1\mathbf e_1+x_2\mathbf e_2+\cdots+x_n\mathbf e_n

矩阵 AA 作用在这个线性组合上:

y=Ax=A(x1e1+x2e2++xnen)=x1Ae1+x2Ae2++xnAen=x1a1+x2a2++xnan\begin{aligned} \mathbf y=A\mathbf x &=A(x_1\mathbf e_1+x_2\mathbf e_2+\cdots+x_n\mathbf e_n)\\ &=x_1A\mathbf e_1+x_2A\mathbf e_2+\cdots+x_nA\mathbf e_n\\ &=x_1\mathbf a_1+x_2\mathbf a_2+\cdots+x_n\mathbf a_n \end{aligned}

其中:

ai=Aei\mathbf a_i=A\mathbf e_i

也就是说,在使用标准基表示时,矩阵的每一列 ai\mathbf a_i 是第 ii 个基向量 ei\mathbf e_i 的像,也是输出空间中的一个方向;输入向量的分量 xix_i 是这个方向的权重,输出 y\mathbf y 就是这些像的线性组合。

列向量不一定构成一组基。对于属于这些列向量张成空间的输出,只有当列向量线性无关时,组合系数才唯一;若它们还张成所讨论的整个空间,才可以称为该空间的一组基。

完整的推导和“矩阵每一列是基向量变换后的落点”等几何解释,见 Matrix 矩阵

行向量视角:输出分量是内积计算

把矩阵按行写成:

A=[r1Tr2TrmT],riRnA=\begin{bmatrix} \mathbf r_1^T\\ \mathbf r_2^T\\ \vdots\\ \mathbf r_m^T \end{bmatrix}, \qquad \mathbf r_i\in\mathbb R^n

那么输出向量的每个分量,都是输入向量与一行的 点积(内积)

yi=riTx=rixy_i=\mathbf r_i^T\mathbf x=\mathbf r_i\cdot\mathbf x

这里,ri\mathbf r_i 可以直观地看作输入空间中的一个测量方向(严格说是一个线性函数的系数向量),yiy_i 就是输入向量 x\mathbf x 在这个方向上的响应。换句话说,矩阵的每一行都对应一个“从输入计算一个输出分量”的线性公式。

任何一个向量都可以表示为基向量按权重的线性组合

B=(b1,b2,,bn)\mathcal B=(\mathbf b_1,\mathbf b_2,\ldots,\mathbf b_n) 是一组基。任意向量 y\mathbf y 都可以唯一表示为这些基向量的线性组合:

y=c1b1+c2b2++cnbn\mathbf y=c_1\mathbf b_1+c_2\mathbf b_2+\cdots+c_n\mathbf b_n

把基向量按列组成矩阵

PB=[b1 b2  bn]P_{\mathcal B}=[\mathbf b_1\ \mathbf b_2\ \cdots\ \mathbf b_n]

把权重(坐标)组成向量 c=(c1,c2,,cn)T\mathbf c=(c_1,c_2,\ldots,c_n)^T,上面的组合就可以写成:

y=PBc\mathbf y=P_{\mathcal B}\mathbf c

因此,c\mathbf c 是向量 y\mathbf y 在基 B\mathcal B 下的坐标,而 PBP_{\mathcal B} 就像一台“合成机器”:输入各个基向量的权重,输出空间中的实际向量。在线性变换 Ax=yA\mathbf x=\mathbf y 中,矩阵的列也正是基向量经过变换后的结果,所以输出仍然是这些“基向量的像”按输入权重合成而来。

观点:线性变换 是一个函数

线性变换,就是一种利用 “变换机器” 改变向量的规则函数,但需要注意这种改变必须保持向量之间的加法和数乘关系。

假设有一个向量:

v=(xy)\mathbf v= \begin{pmatrix} x\\ y \end{pmatrix}

我们设计一个规则,把它变成另一个向量:

v=(xy)\mathbf v' = \begin{pmatrix} x'\\ y' \end{pmatrix}

例如:

T(x,y)=(2x,2y)T(x,y)=(2x,2y)

也就是:

(xy) A=[2002] (2x2y)\begin{pmatrix} x\\y \end{pmatrix} \xrightarrow{\ A=\begin{bmatrix} 2 & 0 \\ 0 & 2 \end{bmatrix}\ } \begin{pmatrix} 2x\\2y \end{pmatrix}

这个变换做的事情很简单:把所有向量放大 2 倍。 这就是一种线性变换

观点:“线性变换” 中的 “线性” 指的是什么?

“线性”(Linear)这个词,最早来自一元函数,意思就是 “线”(line)。

f(x)=ax+bf(x) = ax + b

在二维笛卡尔坐标系中,这就是一条线。但它也是描述的是这个世界上最简单、最直白的一种因果关系:一分耕耘,一分收获,且结果可以完美叠加。 例如投入、产出的关系。

成比例(齐次性 Homogeneity) 指的是,输入的量放大多少倍,输出的结果就跟着放大多少倍。

  • 线性例子: 买 1 个苹果花 5 元。买 10 个苹果,价格就是 10×5=5010 \times 5 = 50 元。数量放大了 10 倍,总价也精确放大了 10 倍。

  • 非线性反例(日常打折): 买 1 个苹果 5 元,但老板说“买 10 个算你 40 元”。这就是线性的了,因为输入放大 10 倍,输出并没有严格放大 10 倍(不再成比例)。

可叠加(可加性 Additivity) 两个独立的事情分别产生的结果,等于把这两件事放在一起产生的结果。

  • 线性例子: 你昨天买了 2 个苹果(花 10 元),今天买了 3 个苹果(花 15 元)。你这两天买苹果的总花费,刚好等于你一次性买 5 个苹果的花费(25 元)。满足 10+15=2510 + 15 = 25

  • 非线性反例(煮鸡蛋): 煮熟 1 个鸡蛋需要 10 分钟,煮熟 2 个鸡蛋需要 20 分钟吗?不是的,一起放在锅里煮依然只需要 10 分钟。这种“时间叠加”就是线性的。

如果你把这种规则写成数学函数 f(x)f(x),那么“线性” 只需要满足下面两个简单的方程:

  1. 可加性: f(x+y)=f(x)+f(y)f(x + y) = f(x) + f(y)
  2. 齐次性: f(cx)=cf(x)f(cx) = c \cdot f(x)(这里的 cc 代表任意常数)

因为真实世界太复杂了(天气变化、流体力学、股票市场全是非线性的,充满蝴蝶效应),计算起来极其困难。而“线性”关系是极度可预测的。只要我们把复杂问题拆解、逼近成线性的,计算机和数学家就能通过矩阵和向量,瞬间算出千丝万缕的联系。

对于 一元函数 来说,满足可加性齐次性的,只能是 b=0b=0 的情况,即 f(x)=axf(x)=ax

验证一下为什么 b0b \neq 0 不行:

  • 齐次性f(2x)=2ax+bf(2x)=2ax+b ,而 2f(x)=2ax+2b2f(x)=2ax+2b ,除非 b=0b=0 ,否则不相等。
  • 可加性f(x+y)=a(x+y)+bf(x+y)=a(x+y)+b ,而 f(x)+f(y)=ax+b+ay+b=a(x+y)+2bf(x)+f(y)=ax+b+ay+b=a(x+y)+2b ,除非 b=0b=0 ,否则不相等。

我们说:

  • f(x)=ax+bf(x)=ax+bb0b \neq 0 )→ 图像是直线,但不是线性变换(叫仿射变换
  • f(x)=axf(x)=ax → 图像是过原点的直线,才是线性变换

要理解向量中的“线性变换"必须从理解其两个性质: 可加性(Additivity)、 齐次性(Homogeneity) 入手

性质 1:保持加法 可加性(Additivity)

如果:

T(u+v)T(\mathbf u+\mathbf v)

那么必须等于:

T(u)+T(v) T(\mathbf u)+T(\mathbf v)

也就是说:

先把两个向量加起来,再变换

先分别变换,再把结果加起来

结果必须一样。

性质 2:保持数乘 齐次性(Homogeneity)

对于任意数字 c:

T(cv)=cT(v) T(c\mathbf v)=cT(\mathbf v)

也就是说:

先把向量放大 cc 倍,再进行变换

先进行变换,再把结果放大 cc 倍

结果必须一样。

两个性质可以合并写

可加性 + 齐次性,本质上是在说同一件事:线性变换保持线性组合

T(au+bv)=aT(u)+bT(v)T(a\mathbf{u} + b\mathbf{v}) = a\,T(\mathbf{u}) + b\,T(\mathbf{v})

观点:线性变换的几何意义

前面用代数语言说了"线性"要满足可加性和齐次性,但这两条规则在几何上到底长什么样

把二维平面想象成一张画满网格的坐标纸。一个变换作用在所有向量上,就相当于整张纸被"动"了一下。而线性变换,就是那张纸满足下面两条规矩的"动法":

  1. 网格线保持平行且等间距(Parallel and evenly spaced)——原来平行的线变换后依然平行,原来间距相等的线变换后间距依然相等(间距本身可以变);

  2. 原点保持不动(Origin stays fixed)——T(0)=0T(\mathbf{0})=\mathbf{0},零向量不会被挪走。

为什么这两条规矩刚好对应可加性和齐次性?

  • 原点不动对应齐次性:T(cv)=cT(v)T(c\mathbf v)=cT(\mathbf v) 里取 c=0c=0,必然有 T(0)=0T(\mathbf 0)=\mathbf 0。所以"平移"永远不是线性变换——它把原点挪走了(这也解释了前面 f(x)=ax+bf(x)=ax+b 为什么只是仿射变换)。

  • 网格线保持平行等间距对应可加性:向量加法的几何是"平行四边形法则"。只要变换后网格还是均匀平行的,加法拼出来的平行四边形就不会被"掰弯",变换前后做加法的顺序才可以互换。

例子:剪切变换(Shear)

看这个变换:

T(x,y)=(x+y, y)T(x,y)=(x+y,\ y)

把它写成"变换机器"的矩阵 AA 长什么样?只需要问一个问题:两个基向量被它送到了哪里?

  • i=(1,0)\mathbf i=(1,0) 送去哪:T(1,0)=(1+0, 0)=(1,0)T(1,0)=(1+0,\ 0)=(1,0) —— 没动;
  • j=(0,1)\mathbf j=(0,1) 送去哪:T(0,1)=(0+1, 1)=(1,1)T(0,1)=(0+1,\ 1)=(1,1) —— 被"推斜"了。

把这两个落点按列放进矩阵,就得到了 AA

A=[1101]A=\begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix}

验证一下,矩阵乘出来的结果和上面的规则一模一样:

Ax=[1101](xy)=(x+yy)=T(x,y)A\mathbf x=\begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix}\begin{pmatrix} x\\ y \end{pmatrix}=\begin{pmatrix} x+y\\ y \end{pmatrix}=T(x,y)

连续的过程可以看得更清楚——下面这张动图演示了网格从"方方正正"被连续"推斜"的全过程:

注意看:网格线在变形过程中始终保持平行、等间距,原点纹丝不动;绿色的 v\mathbf v 滑动到 T(v)T(\mathbf v),但两条虚线"拼装路径"的步数始终是 2233

  • 变换前(左图):v=(2,3)=2i+3j\mathbf v=(2,3)=2\mathbf i+3\mathbf j,就是"沿 i\mathbf i 走 2 步、沿 j\mathbf j 走 3 步";
  • 变换后(右图):整个网格被"推斜"了——竖线变斜了,但所有网格线依然平行、间距依然相等,原点还在原地

注意最妙的地方:变换前 “22i\mathbf i + 33j\mathbf j” 到达 v\mathbf v,变换后 “22T(i)T(\mathbf i) + 33T(j)T(\mathbf j)” 到达 T(v)=(5,3)T(\mathbf v)=(5,3)步数(线性组合的系数)一点没变,变的只是"每一步踩在哪里"。

T(2i+3j)=2T(i)+3T(j)T(2\mathbf i+3\mathbf j)=2\,T(\mathbf i)+3\,T(\mathbf j)

这正是可加性 + 齐次性的几何画面:线性变换不会打乱向量的"拼装配方",它只是把整个空间连同配方一起搬过去。

例子:旋转变换(Rotation)

这次把整个平面逆时针旋转 9090^\circ

T(x,y)=(y, x)T(x,y)=(-y,\ x)

老问题:两个基向量被它送到了哪里?

  • i=(1,0)\mathbf i=(1,0) 转到了 (0,1)(0,1)
  • j=(0,1)\mathbf j=(0,1) 转到了 (1,0)(-1,0)

把落点按列放进矩阵

A=[0110]A=\begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix}

验证一下,输入 (x,y)(x,y),输出依然是 T(x,y)T(x,y)

Ax=[0110](xy)=(yx)=T(x,y)A\mathbf x=\begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix}\begin{pmatrix} x\\ y \end{pmatrix}=\begin{pmatrix} -y\\ x \end{pmatrix}=T(x,y)

同样看一下连续的过程——整个网格绕原点刚性地00^\circ 转到 9090^\circ

转动全程网格都是方方正正的:平行、等间距、原点不动从头到尾没有被破坏,v\mathbf v 的"拼装路径"(两条虚线)跟着网格一起转,步数始终是 2233

  • 变换后(右图):整个网格被"转"到了第二象限——方格还是方格,平行、等间距、原点不动,规矩依然全部满足;
  • 同一个 v=(2,3)\mathbf v=(2,3) 转到了 T(v)=(3,2)T(\mathbf v)=(-3,2),拼装配方照旧:"22T(i)T(\mathbf i) + 33T(j)T(\mathbf j)"。

对比两个例子:剪切把方格"推斜"成平行四边形,旋转把方格"转"了个方向——网格的形状可以变,但"平行、等间距、原点不动"这三条不能破,这就是"线性"在几何上的底线。