Matrix 矩阵

矩阵(MatrixMatrix)是人们在解决线性方程组、研究线性变换的过程中,逐渐抽象出来的一种数学工具。

从形式上看,矩阵(MatrixMatrix)就是按照“行”和“列”排列起来的一组数字。例如:

A=[123456]A= \begin{bmatrix} 1 & 2 & 3\\ 4 & 5 & 6 \end{bmatrix}

它有 2 行、3 列,所以叫做 2×3 矩阵。在 NumPy 等编程工具中,也记作:

shape=(2,3)shape=(2,3)

概念:Coefficient matrix 方程的系数矩阵

在线性代数里,一个矩阵最常扮演的角色就是方程组的系数矩阵 ——把方程组里所有未知数前面的系数按位置抄下来,排成的一张表。

比如方程组:

{2x+3y=8xy=1\begin{cases} 2x + 3y = 8\\ x - y = 1 \end{cases}

把系数抽出来:每行 = 一个方程,每列 = 一个未知数

A=[2311]A = \begin{bmatrix} 2 & 3\\ 1 & -1 \end{bmatrix}

第一列全是 xx 的系数,第二列全是 yy 的系数;未知数 [xy]\begin{bmatrix} x\\ y \end{bmatrix} 和等号右边的 [81]\begin{bmatrix} 8\\ 1 \end{bmatrix} 都被"分离"出去了——矩阵本身只管系数

这样做的好处是:方程组被拆成了"系数(AA)+ 未知数(xx)+ 结果(bb)“三部分,可以分别研究。有时还会把 bb 也并进来,写成增广矩阵(augmented matrix):

[238111]\left[ \begin{array}{cc|c} 2 & 3 & 8\\ 1 & -1 & 1 \end{array} \right]

消元法就是在增广矩阵上做行变换。

所以在线性代数中看到一个矩阵,第一反应可以是:它很可能就是某个方程组的系数表。下面"动机"会把这件事完整展开。

动机

为什么要用到矩阵?有两个重要的动机:

动机一:抽象出线性方程组

方程组:

{a11x1+a12x2+a13x3=b1a21x1+a22x2+a23x3=b2a31x1+a32x2+a33x3=b3\begin{cases} a_{11}x_1+a_{12}x_2+a_{13}x_3=b_1\\ a_{21}x_1+a_{22}x_2+a_{23}x_3=b_2\\ a_{31}x_1+a_{32}x_2+a_{33}x_3=b_3 \end{cases}

人们把系数、变量、结果分别组织成矩阵 AA、向量 xx、向量 bb

A=[a11a12a13a21a22a23a31a32a33],x=[x1x2x3],b=[b1b2b3]A= \begin{bmatrix} a_{11}&a_{12}&a_{13}\\ a_{21}&a_{22}&a_{23}\\ a_{31}&a_{32}&a_{33} \end{bmatrix}, \quad x = \begin{bmatrix} x_1\\ x_2\\ x_3 \end{bmatrix}, \quad b= \begin{bmatrix} b_1\\ b_2\\ b_3 \end{bmatrix}

整个方程组就可以压缩成:

Ax=bAx=b

规定运算过程,就是矩阵的每一行成为一个新的向量,与向量 xx点积,就还原出原方程:

Ax=[第 1 行x第 2 行x第 3 行x]=[a11x1+a12x2+a13x3a21x1+a22x2+a23x3a31x1+a32x2+a33x3]=[b1b2b3]Ax = \begin{bmatrix} \text{第 1 行} \cdot x\\ \text{第 2 行} \cdot x\\ \text{第 3 行} \cdot x \end{bmatrix} = \begin{bmatrix} a_{11}x_1+a_{12}x_2+a_{13}x_3\\ a_{21}x_1+a_{22}x_2+a_{23}x_3\\ a_{31}x_1+a_{32}x_2+a_{33}x_3 \end{bmatrix} = \begin{bmatrix} b_1\\ b_2\\ b_3 \end{bmatrix}

所以“压缩”不是魔法,而是逐行点积的缩写

矩阵把一大堆线性方程的共同结构提取出来了。

动机二:描述线性变换

随着人们认知的深入,矩阵被用来表示线性变换(linear transformation)——整个空间按照同一个规则发生的变化。

比如我们规定一个缩放(scaling)规则:

x方向扩大2倍,y方向扩大3倍。

那么原来的点:(2,3)(2,3),就会变成:(4,9)(4,9)。要把这个“变化规则”记录下来,可以这样表示:

(x,y)(2x,3y)(x, y)→(2x,3y)

但数学家希望有一种更加统一、更加方便计算的表达方式。

于是可以写成:

[2003][xy]=[2x+0y0x+3y]=[2x3y]\begin{bmatrix} 2&0\\ 0&3 \end{bmatrix} \begin{bmatrix} x\\ y \end{bmatrix} = \begin{bmatrix} 2x+0y\\ 0x+3y \end{bmatrix} = \begin{bmatrix} 2x\\ 3y \end{bmatrix}

这里同样用到了点积:结果的每个分量,就是矩阵的一行与 (x,y)(x,y) 的点积。

关键在于这个系数表:

[2003]\begin{bmatrix} 2&0\\ 0&3 \end{bmatrix}

这就是一个矩阵。它还有一个更深刻的读法:矩阵的每一列,就是标准基向量变换后的落点——两列 (2,0)(2,0)(0,3)(0,3) 正是 i^=(1,0)\hat{\mathbf{i}}=(1,0)j^=(0,1)\hat{\mathbf{j}}=(0,1) 被变换后的位置。

这个规则并不是只对这个点有效。任何一个点丢进去,都按照同一个规则变化。我们实际上不是在改变“某一个点”。而是在定义整个空间应该怎么变化。(“线性”体现在:原点保持不动,直线变换后仍然是直线。)这就是为什么我们说:

矩阵可以描述空间的变换。

这时候,“矩阵”和“向量”的关系就非常清楚了。可以把它们想象成:

向量:要描述“某个东西在哪里、是什么状态” 矩阵:我要描述“这个东西怎么变化”

于是:

Au=vAu=v

就是:

按照 AA 规定的变化规则,让 uu 发生变化,成为 vv

两个动机在这里统一了:解方程 Ax=bAx=b,本质上就是问——“哪个向量 xx 经过变换 AA 之后,恰好落在 bb?”解方程其实是变换的逆问题

这也是线性代数里非常核心的思想。这个"逆问题"的数学化就是 Inverse Matrix 逆矩阵Ax=bAx=b 的解正是 x=A1bx=A^{-1}b

视角:矩阵的每一列是基向量变换后的落点

在介绍具体变换之前,我们需要深刻理解:为什么矩阵的每一列就是基向量变换后的落点? 这是理解线性代数几何直觉的核心。

1. 从基向量拆分向量

在二维坐标系中,任意一个向量 v=[xy]\mathbf{v} = \begin{bmatrix} x \\ y \end{bmatrix} 都可以看作是标准基向量 i^=[10]\hat{\mathbf{i}} = \begin{bmatrix} 1 \\ 0 \end{bmatrix}j^=[01]\hat{\mathbf{j}} = \begin{bmatrix} 0 \\ 1 \end{bmatrix} 的线性组合(Linear Combination):

v=x[10]+y[01]=xi^+yj^\mathbf{v} = x \begin{bmatrix} 1 \\ 0 \end{bmatrix} + y \begin{bmatrix} 0 \\ 1 \end{bmatrix} = x\hat{\mathbf{i}} + y\hat{\mathbf{j}}

它的几何意义非常简单:i^\hat{\mathbf{i}} 方向走 xx 步,在 j^\hat{\mathbf{j}} 方向走 yy 步。

2. 线性变换的网格保持性

线性变换(Linear Transformation)最核心的特点是:原点不动,网格线保持平行且等距。 这意味着,当整个空间发生线性变换 TT 时,变换后的向量 T(v)T(\mathbf{v}),依然等于原系数 x,yx, y 乘以变换后的基向量

T(v)=T(xi^+yj^)=xT(i^)+yT(j^)T(\mathbf{v}) = T(x\hat{\mathbf{i}} + y\hat{\mathbf{j}}) = x \cdot T(\hat{\mathbf{i}}) + y \cdot T(\hat{\mathbf{j}})

核心结论:我们不需要关心空间里无数个点分别变到了哪里,只要知道基向量 i^\hat{\mathbf{i}}j^\hat{\mathbf{j}} 落在哪,整个空间中任意一点变换后的位置就彻底确定了!

3. 数学推导:落点如何拼成矩阵

假设经过某种线性变换后:

  • 第一基向量 i^=[10]\hat{\mathbf{i}} = \begin{bmatrix} 1 \\ 0 \end{bmatrix} 落到了新位置 [ac]\begin{bmatrix} a \\ c \end{bmatrix}
  • 第二基向量 j^=[01]\hat{\mathbf{j}} = \begin{bmatrix} 0 \\ 1 \end{bmatrix} 落到了新位置 [bd]\begin{bmatrix} b \\ d \end{bmatrix}

那么任意向量 [xy]\begin{bmatrix} x \\ y \end{bmatrix} 变换后的新向量为:

T([xy])=x[ac]+y[bd]=[ax+bycx+dy]T\left(\begin{bmatrix} x \\ y \end{bmatrix}\right) = x \begin{bmatrix} a \\ c \end{bmatrix} + y \begin{bmatrix} b \\ d \end{bmatrix} = \begin{bmatrix} ax + by \\ cx + dy \end{bmatrix}

如果我们将这两个落点向量按顺序当作列向量拼成一个矩阵 AA

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

计算矩阵乘以向量 [xy]\begin{bmatrix} x \\ y \end{bmatrix}

A[xy]=[abcd][xy]=x[ac]+y[bd]=[ax+bycx+dy]A \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} a & b \\ c & d \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} = x \begin{bmatrix} a \\ c \end{bmatrix} + y \begin{bmatrix} b \\ d \end{bmatrix} = \begin{bmatrix} ax + by \\ cx + dy \end{bmatrix}

把两个标准基向量直接带入验证:

  • A[10]=1a1+0a2=a1A \begin{bmatrix} 1 \\ 0 \end{bmatrix} = 1 \cdot \mathbf{a}_1 + 0 \cdot \mathbf{a}_2 = \mathbf{a}_1 (提取矩阵第 1 列,正是 i^\hat{\mathbf{i}} 的落点)
  • A[01]=0a1+1a2=a2A \begin{bmatrix} 0 \\ 1 \end{bmatrix} = 0 \cdot \mathbf{a}_1 + 1 \cdot \mathbf{a}_2 = \mathbf{a}_2 (提取矩阵第 2 列,正是 j^\hat{\mathbf{j}} 的落点)

4. 简单例子:构造逆时针 90° 旋转矩阵

假设我们要设计一个让整个空间逆时针旋转 90° 的矩阵,不需要记忆繁琐公式,只需要看两个基向量去到了哪里:

  1. i^=(1,0)\hat{\mathbf{i}} = (1, 0) 逆时针旋转 90° 后落到 (0,1)(0, 1) \rightarrow 这是矩阵的第 1 列 [01]\begin{bmatrix} 0 \\ 1 \end{bmatrix}
  2. j^=(0,1)\hat{\mathbf{j}} = (0, 1) 逆时针旋转 90° 后落到 (1,0)(-1, 0) \rightarrow 这是矩阵的第 2 列 [10]\begin{bmatrix} -1 \\ 0 \end{bmatrix}

把这两列拼在一起,直接写出旋转矩阵:

R90=[0110]R_{90^\circ} = \begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix}

试着用它旋转点 (2,3)(2,3)

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

直观来看,点 (2,3)(2,3) 在第二象限逆时针旋转 90° 确实到了 (3,2)(-3,2)


视角: 系数矩阵乘向量的“列组合视角”

一个向量 xx 本质上是在说:一个向量沿着他的各个基向量走多少。xix_i 是这个向量的分量。

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

系数矩阵可以理解为记录每一个标准基向量经过线性变换之后去了哪里。

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

因为

Ae1=a1,Ae2=a2,A\mathbf e_1=\mathbf a_1,\qquad A\mathbf e_2=\mathbf a_2,\qquad\cdots

所以矩阵的第 ii 列就是对应基向量经过变换后的像:

Aei=aiA\mathbf e_i=\mathbf a_i

这里的 ai\mathbf a_i 不一定仍然是一组基向量;只有当这些列向量线性无关时,它们才构成一组新的基。

矩阵乘向量是什么?

原来的向量:

x=x1e1+x2e2\mathbf x=x_1\mathbf e_1+x_2\mathbf e_2

经过矩阵变换:

Ax=A(x1e1+x2e2)A\mathbf x=A(x_1\mathbf e_1+x_2\mathbf e_2)=x1Ae1+x2Ae2=x_1A\mathbf e_1+x_2A\mathbf e_2

即:

Ax=x1a1+x2a2 A\mathbf x=x_1\mathbf a_1+x_2\mathbf a_2

所以你可以把整个过程想象成:

先分别计算基向量经过变换后的像,再用原向量的坐标系数重新组合这些像。

下面的动画用剪切变换展示这件事。左边是原来的网格和向量

x=2e1+3e2\mathbf x=2\mathbf e_1+3\mathbf e_2

右边是变换后的网格:先看两个基向量的像 Ae1A\mathbf e_1Ae2A\mathbf e_2,再沿着这两个新方向分别走 22 步和 33 步,最后得到:

Ax=2Ae1+3Ae2A\mathbf x=2A\mathbf e_1+3A\mathbf e_2

动画中绿色向量的“拼装配方”始终是 2233:改变的是基向量经过变换后的方向和位置,坐标系数并没有改变。

这里是向量被矩阵变换了,坐标系仍然作为参考保持不动。改变的是 eie_i基向量的像 ai\mathbf a_i,而不是把坐标系本身搬走。

请结合 深入理解:矩阵变换的几何意义 这篇文章来理解。

运算:一般规则

矩阵加法

两个形状相同的矩阵相加,就是对应位置的数字分别相加:

[1234]+[5678]=[681012]\begin{bmatrix} 1 & 2\\ 3 & 4 \end{bmatrix} + \begin{bmatrix} 5 & 6\\ 7 & 8 \end{bmatrix} = \begin{bmatrix} 6 & 8\\ 10 & 12 \end{bmatrix}

形状条件:必须是 m×n+m×nm \times n + m \times n,形状不同没法对齐位置,加法无意义。

含义:两个变换的效果叠加。 把矩阵看作"变换机器”,A+BA+B 就是"两台机器各算一遍,再把输出相加":

(A+B)x=Ax+Bx(A+B)\mathbf{x} = A\mathbf{x} + B\mathbf{x}

验证一下。取放大 2 倍的 A=[2002]A = \begin{bmatrix} 2 & 0\\ 0 & 2 \end{bmatrix} 和剪切 B=[1101]B = \begin{bmatrix} 1 & 1\\ 0 & 1 \end{bmatrix},输入 x=[12]\mathbf{x} = \begin{bmatrix} 1\\ 2 \end{bmatrix}

  • 先加矩阵再变换:(A+B)x=[3103][12]=[56](A+B)\mathbf{x} = \begin{bmatrix} 3 & 1\\ 0 & 3 \end{bmatrix} \begin{bmatrix} 1\\ 2 \end{bmatrix} = \begin{bmatrix} 5\\ 6 \end{bmatrix}
  • 分别变换再加输出:Ax=[24]A\mathbf{x} = \begin{bmatrix} 2\\ 4 \end{bmatrix}Bx=[32]B\mathbf{x} = \begin{bmatrix} 3\\ 2 \end{bmatrix},相加也是 [56]\begin{bmatrix} 5\\ 6 \end{bmatrix}

标量乘法

一个数字(标量)乘以一个矩阵,就是乘到每一个元素上:

2[1234]=[2468]2 \cdot \begin{bmatrix} 1 & 2\\ 3 & 4 \end{bmatrix} = \begin{bmatrix} 2 & 4\\ 6 & 8 \end{bmatrix}

没有形状限制,任何矩阵都可以。

含义:变换的"力度"整体放大。 把矩阵看作变换机器,cAcA 就是"同一套变换规则,但所有输出都被缩放 cc 倍":

(cA)x=c(Ax)(cA)\mathbf{x} = c\,(A\mathbf{x})

从"列 = 基向量落点"的视角看更直观:cAcA 的每一列就是原来落点的 cc 倍——基向量的落点全部缩放 cc 倍,整个空间的变换效果自然跟着缩放 cc 倍。

验证一下。取剪切 A=[1101]A = \begin{bmatrix} 1 & 1\\ 0 & 1 \end{bmatrix}c=3c = 3,输入 x=[12]\mathbf{x} = \begin{bmatrix} 1\\ 2 \end{bmatrix}

  • 先缩放矩阵再变换:(3A)x=[3303][12]=[96](3A)\mathbf{x} = \begin{bmatrix} 3 & 3\\ 0 & 3 \end{bmatrix} \begin{bmatrix} 1\\ 2 \end{bmatrix} = \begin{bmatrix} 9\\ 6 \end{bmatrix}
  • 先变换再缩放输出:Ax=[32]A\mathbf{x} = \begin{bmatrix} 3\\ 2 \end{bmatrix},乘 3 也是 [96]\begin{bmatrix} 9\\ 6 \end{bmatrix}

一个和 行列式 有关的推论:缩放矩阵会放大行列式的缩放倍数n×nn \times n 矩阵有 det(cA)=cndet(A)\det(cA) = c^n \det(A)——面积/体积的缩放是"每个维度各乘一次 cc",nn 个维度就是 cnc^n。比如 2 阶矩阵放大 3 倍,面积缩放变成原来的 32=93^2 = 9 倍。

矩阵乘法

ABA、B 矩阵的乘法为:

ABAB 的第 ii 行、第 jj 列的元素 = AA 的第 ii 行 · BB 的第 jj 列(点积)

公式:

cij=kaikbkjc_{ij} = \sum_{k} a_{ik}\, b_{kj}

计算前提、形状条件AA 的列数必须等于 BB 的行数,否则行与列长度不同,点积无从谈起:

(m×n)(n×p)=(m×p)(m\times n)\cdot(n\times p) = (m\times p)

内侧的两个 nn“抵消”,留下外侧的 mmpp

2×2 矩阵乘法公式的推导

一般地,两个 2×2 矩阵相乘的完整公式:

[a11a12a21a22][b11b12b21b22]=[a11b11+a12b21a11b12+a12b22a21b11+a22b21a21b12+a22b22]\begin{bmatrix} a_{11}&a_{12}\\ a_{21}&a_{22} \end{bmatrix} \begin{bmatrix} b_{11}&b_{12}\\ b_{21}&b_{22} \end{bmatrix} = \begin{bmatrix} a_{11}b_{11}+a_{12}b_{21} & a_{11}b_{12}+a_{12}b_{22}\\ a_{21}b_{11}+a_{22}b_{21} & a_{21}b_{12}+a_{22}b_{22} \end{bmatrix}

我们说,两个 2×2 矩阵 AABB 作用于向量 xx,定义为:

A=[a11a12a21a22]B=[b11b12b21b22]A= \begin{bmatrix} a_{11}&a_{12}\\ a_{21}&a_{22} \end{bmatrix},B= \begin{bmatrix} b_{11}&b_{12}\\ b_{21}&b_{22} \end{bmatrix}ABx=[a11b11+a12b21a11b12+a12b22a21b11+a22b21a21b12+a22b22]这就是 AB[x1x2]ABx = \underbrace{\begin{bmatrix} a_{11}b_{11}+a_{12}b_{21} & a_{11}b_{12}+a_{12}b_{22}\\ a_{21}b_{11}+a_{22}b_{21} & a_{21}b_{12}+a_{22}b_{22} \end{bmatrix}}_{\text{这就是 }AB} \begin{bmatrix} x_1\\ x_2 \end{bmatrix}

表示:

  • 先用 BB 变换:xBxx \mapsto Bx
  • 再用 AA 变换:BxA(Bx)Bx \mapsto A(Bx)

我们希望这个复合效果也能用一个单一的矩阵 CC 来表示,使得:

Cx=A(Bx)Cx = A(Bx)

这个 CC 就是 AABB 的乘积,记作 C=ABC=AB

C=[a11b11+a12b21a11b12+a12b22a21b11+a22b21a21b12+a22b22]C = \begin{bmatrix} a_{11}b_{11}+a_{12}b_{21} & a_{11}b_{12}+a_{12}b_{22}\\ a_{21}b_{11}+a_{22}b_{21} & a_{21}b_{12}+a_{22}b_{22} \end{bmatrix}

这个公式是怎么推导出来的?

第一步:先算 BxBx

Bx=[b11b12b21b22][x1x2]=[b11x1+b12x2b21x1+b22x2]Bx= \begin{bmatrix} b_{11}&b_{12}\\ b_{21}&b_{22} \end{bmatrix} \begin{bmatrix} x_1\\ x_2 \end{bmatrix} = \begin{bmatrix} b_{11}x_1+b_{12}x_2\\ b_{21}x_1+b_{22}x_2 \end{bmatrix}

这个时候,BxBx 看作是一样新的向量。

第二步:把结果代入 AA

A(Bx)=[a11a12a21a22][b11x1+b12x2b21x1+b22x2]A(Bx)= \begin{bmatrix} a_{11}&a_{12}\\ a_{21}&a_{22} \end{bmatrix} \begin{bmatrix} b_{11}x_1+b_{12}x_2\\ b_{21}x_1+b_{22}x_2 \end{bmatrix}

按矩阵乘向量的规则展开:

=[a11(b11x1+b12x2)+a12(b21x1+b22x2)a21(b11x1+b12x2)+a22(b21x1+b22x2)]= \begin{bmatrix} a_{11}(b_{11}x_1+b_{12}x_2)+a_{12}(b_{21}x_1+b_{22}x_2)\\ a_{21}(b_{11}x_1+b_{12}x_2)+a_{22}(b_{21}x_1+b_{22}x_2) \end{bmatrix}

第三步:按 x1x_1x2x_2 合并同类项

第一行:

a11b11x1+a11b12x2+a12b21x1+a12b22x2=(a11b11+a12b21)x1+(a11b12+a12b22)x2\begin{aligned} &a_{11}b_{11}x_1+a_{11}b_{12}x_2+a_{12}b_{21}x_1+a_{12}b_{22}x_2\\ &= (a_{11}b_{11}+a_{12}b_{21})x_1+(a_{11}b_{12}+a_{12}b_{22})x_2 \end{aligned}

第二行:

a21b11x1+a21b12x2+a22b21x1+a22b22x2=(a21b11+a22b21)x1+(a21b12+a22b22)x2\begin{aligned} &a_{21}b_{11}x_1+a_{21}b_{12}x_2+a_{22}b_{21}x_1+a_{22}b_{22}x_2\\ &= (a_{21}b_{11}+a_{22}b_{21})x_1+(a_{21}b_{12}+a_{22}b_{22})x_2 \end{aligned}

第四步:写成矩阵乘向量的形式

把上面的结果重新写成"矩阵 × 向量":

A(Bx)=[a11b11+a12b21a11b12+a12b22a21b11+a22b21a21b12+a22b22]这就是 AB[x1x2]A(Bx)= \underbrace{\begin{bmatrix} a_{11}b_{11}+a_{12}b_{21} & a_{11}b_{12}+a_{12}b_{22}\\ a_{21}b_{11}+a_{22}b_{21} & a_{21}b_{12}+a_{22}b_{22} \end{bmatrix}}_{\text{这就是 }AB} \begin{bmatrix} x_1\\ x_2 \end{bmatrix}

结论

为了让"先 BBAA 的复合变换"等于"一个单一矩阵的作用",即:

(AB)x=A(Bx)(AB)x = A(Bx)

ABAB 必须是:

AB=[a11b11+a12b21a11b12+a12b22a21b11+a22b21a21b12+a22b22]AB= \begin{bmatrix} a_{11}b_{11}+a_{12}b_{21} & a_{11}b_{12}+a_{12}b_{22}\\ a_{21}b_{11}+a_{22}b_{21} & a_{21}b_{12}+a_{22}b_{22} \end{bmatrix}

一句话总结 矩阵乘法公式不是人为规定的,而是从"变换复合"的需求中自然推导出来的。

运算:常见矩阵变换

既然矩阵的每一列就是基向量变换后的落点,那么想设计任何一种线性变换,只需要回答一个问题:

i^=(1,0)\hat{\mathbf{i}}=(1,0)j^=(0,1)\hat{\mathbf{j}}=(0,1) 被变换后,分别落到哪里?

把这两个落点作为两列拼起来,就得到了对应的矩阵。下面用这个方法构造几种最常用的变换。

缩放(Scaling)

前面已经见过:x 方向扩大 sxs_x 倍,y 方向扩大 sys_y 倍。

  • i^\hat{\mathbf{i}} 落到 (sx,0)(s_x, 0)
  • j^\hat{\mathbf{j}} 落到 (0,sy)(0, s_y)
S=[sx00sy]S= \begin{bmatrix} s_x&0\\ 0&s_y \end{bmatrix}

旋转(Rotation)

让整个空间绕原点逆时针旋转角度 θ\theta

  • i^=(1,0)\hat{\mathbf{i}}=(1,0) 旋转后落到 (cosθ, sinθ)(\cos\theta,\ \sin\theta)
  • j^=(0,1)\hat{\mathbf{j}}=(0,1) 旋转后落到 (sinθ, cosθ)(-\sin\theta,\ \cos\theta)

(这正是单位圆上三角函数的定义:角度 θ\theta 处的点是 (cosθ,sinθ)(\cos\theta,\sin\theta);而 j^\hat{\mathbf{j}} 在角度 θ+90°\theta+90° 处。)

把两个落点拼成列:

R=[cosθsinθsinθcosθ]R= \begin{bmatrix} \cos\theta&-\sin\theta\\ \sin\theta&\cos\theta \end{bmatrix}

验证一下,旋转 (1,0)(1,0)

R[10]=[cosθsinθ]R \begin{bmatrix} 1\\ 0 \end{bmatrix} = \begin{bmatrix} \cos\theta\\ \sin\theta \end{bmatrix}

结果恰好是 i^\hat{\mathbf{i}} 的落点,符合预期。

剪切(Shear)

剪切就像推一叠扑克牌:y 坐标越高的点,x 方向被推得越远(保持 y 不变,x 加上 kk 倍的 y):

(x,y)(x+ky, y)(x,y)\to(x+ky,\ y)

看基向量的落点:

  • i^=(1,0)\hat{\mathbf{i}}=(1,0)y=0y=0,不动,还是 (1,0)(1,0)
  • j^=(0,1)\hat{\mathbf{j}}=(0,1)y=1y=1,被推到 (k,1)(k,1)
H=[1k01]H= \begin{bmatrix} 1&k\\ 0&1 \end{bmatrix}

一个正方形经过剪切会变成平行四边形——面积不变,但形状被"推歪"了。

投影(Projection)

把所有点垂直压到 x 轴上:y 坐标直接清零。

(x,y)(x, 0)(x,y)\to(x,\ 0)

基向量的落点:

  • i^\hat{\mathbf{i}} 本来就在 x 轴上,不动:(1,0)(1,0)
  • j^\hat{\mathbf{j}} 被压到原点:(0,0)(0,0)
P=[1000]P= \begin{bmatrix} 1&0\\ 0&0 \end{bmatrix}

投影是一种"坍缩":整个二维平面被压成一条直线。这也解释了为什么投影矩阵不可逆——无数个点被压到了同一个位置,信息已经丢失,无法还原。

更一般地,投影到任意过原点的直线(方向单位向量为 (cosφ,sinφ)(\cos\varphi,\sin\varphi))的矩阵是:

Pφ=[cos2φsinφcosφsinφcosφsin2φ]P_\varphi= \begin{bmatrix} \cos^2\varphi&\sin\varphi\cos\varphi\\ \sin\varphi\cos\varphi&\sin^2\varphi \end{bmatrix}

反射(Reflection)

沿 x 轴翻转:y 坐标取反。(x,y)(x,y)(x,y)\to(x,-y)

  • i^\hat{\mathbf{i}} 不动:(1,0)(1,0)
  • j^\hat{\mathbf{j}} 翻到 (0,1)(0,-1)
F=[1001]F= \begin{bmatrix} 1&0\\ 0&-1 \end{bmatrix}

组合变换

这些基本变换可以用矩阵乘法组合起来。例如"先剪切、再旋转 90°":

RH[xy]=[0110][1k01][xy]=[011k][xy]RH \begin{bmatrix} x\\ y \end{bmatrix} = \begin{bmatrix} 0&-1\\ 1&0 \end{bmatrix} \begin{bmatrix} 1&k\\ 0&1 \end{bmatrix} \begin{bmatrix} x\\ y \end{bmatrix} = \begin{bmatrix} 0&-1\\ 1&k \end{bmatrix} \begin{bmatrix} x\\ y \end{bmatrix}

一个新矩阵就同时完成了两件事——这正是"矩阵乘法 = 变换的复合"的实际用途。

一句话总结 设计变换矩阵不需要背公式:只要想清楚两个基向量去了哪里,把它们写成列,矩阵就出来了。

区分:Matrix 矩阵 VS Vector 向量

Vector 向量 是一个特殊的矩阵

形式上 Vector 向量 其实是矩阵的特例 —— 一个 nn 维向量写成竖排,就是一个 n×1n \times 1 的矩阵(叫列向量,column vector);写成横排 vT\mathbf{v}^T,就是一个 1×n1 \times n 的矩阵(叫行向量,row vector)。

这个"特例"关系不是文字游戏:把矩阵的运算规则套在向量上,刚好还原出向量自己的那些运算——

① 矩阵加法 → 向量加法。 两个 n×1n \times 1 矩阵相加就是对应位置相加:

[123]+[456]=[579]\begin{bmatrix} 1\\ 2\\ 3 \end{bmatrix} + \begin{bmatrix} 4\\ 5\\ 6 \end{bmatrix} = \begin{bmatrix} 5\\ 7\\ 9 \end{bmatrix}

这正是 向量加法。标量乘法同理。

② 矩阵乘法 → 矩阵乘向量

AxA\mathbf{x} 其实就是 “第二个只有一列的矩阵"的矩阵乘法:形状规则 (m×n)(n×1)=(m×1)(m \times n)(n \times 1) = (m \times 1),内侧的 nn 抵消;得出的结果为 每个元素 = “行 · 列"的点积” 的向量(一个 m×1m \times 1 的矩阵)。

③ 点积:

向量点积 就是 两个只有一行或一列的矩阵的乘法。行向量(1×n1 \times n)乘列向量(n×1n \times 1),按形状规则得到一个 1×11 \times 1 矩阵——也就是一个数:

aTb=[a1a2a3][b1b2b3]=a1b1+a2b2+a3b3=ab\mathbf{a}^T\mathbf{b} = \begin{bmatrix} a_1 & a_2 & a_3 \end{bmatrix} \begin{bmatrix} b_1\\ b_2\\ b_3 \end{bmatrix} = a_1b_1 + a_2b_2 + a_3b_3 = \mathbf{a} \cdot \mathbf{b}

参见:注意:向量可以看作矩阵的特例

角色上:一个是数据,一个是规则

在一个系数矩阵 中两者都是"一堆数字”,但角色完全不同

Vector 向量Matrix 矩阵
角色数据:描述"某个东西在哪里、是什么状态"规则:描述"这个东西怎么变化"
形状m×1m \times 1(一列数字)或 1×n1 \times nm×nm \times n(一张表)
函数类比函数的输入 / 返回值函数本身
Ax=bA\mathbf{x}=\mathbf{b}x\mathbf{x} 是输入,b\mathbf{b} 是输出AA 是把输入变成输出的"变换机器"

用输入、输出的语言说:向量是被处理的数据,矩阵是处理数据的规则。

矩阵的形状 m×nm \times n 带着这个信息:一个 m×nm \times n 矩阵,吃进去 nn 维向量,吐出来 mm 维向量——乘法的形状规则正好保证了这一点:

Am×n xn×1=bm×1\underbrace{A}_{m \times n}\ \underbrace{\mathbf{x}}_{n \times 1} = \underbrace{\mathbf{b}}_{m \times 1}

比如 2×32 \times 3 矩阵:输入:R3\mathbb{R}^3(3 维),输出:R2\mathbb{R}^2(2 维):

A=(123456),x=(x1x2x3)A = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{pmatrix}, \quad \mathbf{x} = \begin{pmatrix} x_1 \\ x_2 \\ x_3 \end{pmatrix}Ax=(123456)(x1x2x3)=(1x1+2x2+3x34x1+5x2+6x3)A\mathbf{x} = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{pmatrix} \begin{pmatrix} x_1 \\ x_2 \\ x_3 \end{pmatrix} = \begin{pmatrix} 1x_1 + 2x_2 + 3x_3 \\ 4x_1 + 5x_2 + 6x_3 \end{pmatrix}

在机器学习里这个分工天天出现:一条数据(一张图、一个词)是向量,而模型的每一层权重就是矩阵——数据从层间流过,每经过一层就是被一个矩阵变换一次。