3.1 矩阵的四种身份
本节位置:模块 3 · 矩阵与线性映射 | 前置:2.4 基与维数 | 预计:30 分钟
一句话:同一个 的数字阵列,可以读成数据表、线性映射、空间算子或一排列向量——四种读法算的是同一件事。
0. 场景引入
凌晨两点,手机影像团队在调 AR 贴纸。相机内参矩阵是
的传感器(约 1250 万像素),焦距 像素,水平视场 ,主点 正好落在画面中心。
这九个数字被存了三份:标定文件里一份、渲染引擎里一份、回放日志里一份。出问题的是读法——有人按表读(第 1 行是「 像素怎么算」),有人按算子读( 作用在三维坐标上),有人按列读( 的三列是图像坐标系的三个方向)。
决定:这份内参到底存成 还是 ?第三行 看起来只是一次「原样搬运」,能不能省掉?
代价:省掉它,正向投影一模一样,所有单元测试都通过;但 AR 要从用户点击的像素反推一条射线, 没有逆,只能假设「深度 2 米」硬编码。镜头一开防抖,主点漂移 像素,射线就偏 ——2 米外横向偏 mm。贴纸从桌面上浮起两厘米,穿模。
问题:同一份 的数字,为什么可以同时是表、是映射、是算子、是列向量组?四种读法在什么条件下给出同一个答案,在什么条件下开始打架?
读完本节,你应该能回答三件事:
- 四种身份分别对应什么提问方式,各自在代码里长什么样;
- 为什么「第 列是第 个基向量的像」这条恒等式能把四种身份钉在一起;
- 什么时候必须按映射读、什么时候按表读,读反了会坏在哪。
1. 直觉
1.1 四种读法,四种提问
矩阵不是「一堆数」,而是一张可以按行读、按列读、按整体读的表。四种身份对应四种提问方式:
- 数据表(data table):行是样本,列是特征——「小林喜欢什么」。
- 线性映射(linear map):,——「输入会被变成什么」。
- 算子(operator):当 ,它把空间中的每个点搬到另一点——「图形被拉伸、旋转、剪切成了什么样」。
- 列向量组(a list of column vectors):——「这些列张成了什么空间」。
按行得到观测,按列得到响应,按整体得到变换 。
💡 一句话直觉:行是「观测」,列是「响应」,整体是「变换」。
类比边界:数据表可以随意转置;但一旦选定「哪一维是输入、哪一维是输出」,映射方向就固定了,转置会交换输入输出空间。
1.2 现实对应:一台相机的内参矩阵
相机做的事可以一句话说完:把三维世界压到一张二维照片上。这一步在数学上就是 乘三维坐标,再除以第三个分量:
这个式子说的是: 先把「米」换算成「像素」,再靠那个除法把深度除掉。
四种身份在这里全部落地:
- 数据表:3 行 = 3 个输出(),3 列 = 3 个输入()。
- 映射:;但真正输出像素的是后面那一步除法,所以整体是射影映射,不是线性映射。
- 算子: 是方阵且可逆(),它把单位球拉成一个极扁极长的椭球:三个奇异值约 。
- 列向量组:第 3 列 是「相机正前方」这条轴落到的像素位置,也就是主点。
这个类比在哪里失效: 本身是线性的,但「投影」整体不是——除以 破坏了线性性。所以两个点投影的平均,不等于平均点的投影: 与 的两点,在 处的投影不等于它们投影的中点。这也是针孔模型必须带齐次坐标的原因。
1.3 量级直觉
的三个奇异值约 ,所以 。
这个数不是抽象的:相机坐标里 mm 的误差,在 m 处会变成 个像素。反过来,像素空间里 个像素的误差,只对应相机坐标里的 m。像素是「放大过的尺子」,误差在像素空间里看得最清楚。
2. 定义
2.1 矩阵(matrix)与形状
一个 实矩阵是 个数排成的矩形阵列:
记 。 是行数(rows), 是列数(columns), 是第 行第 列的元素。代码里形状写成 [m, n];数学里写成 。数学索引从 1 开始,代码索引从 0 开始。
「矩阵(matrix)」这个名称来自 Sylvester 1850:他把「行列式由之生成的矩形阵列」称为 matrix——当时它还是行列式的附属品,不是独立的运算对象。
2.2 四种身份
数据表: 个样本各有 个特征;第 行是第 个样本,第 列是第 个特征在所有样本上的取值。
线性映射:定义 ,。输入是 维列向量,输出是 维列向量;先记住形状 。这套「线性映射 ↔ 矩阵」的对应在 Horn & Johnson 的第 0 章(基础回顾)里有系统整理。
算子:当 时, 是同一个空间到自身的映射,描述旋转、缩放、剪切、投影等几何动作。
列向量组:把每一列看成一个 维向量,。这 个列向量的所有线性组合构成 的列空间(column space),记作 。
2.3 关键恒等式
设 是 的第 个标准基向量(第 个分量为 1,其余为 0),则
读法:矩阵的第 列,就是第 个基向量被映射到的位置。 这把「列向量组」与「线性映射」两种身份钉死在一起。
3. 为什么这样定义
为什么不把矩阵只定义成二维数组,像 Python 的嵌套列表那样?因为数组只能存数据,不能回答「输入变了输出怎么变」。线性映射的身份给矩阵装上了作用方向:左边乘一个向量,就得到一次变换的结果。没有它,矩阵乘法、逆矩阵、特征值全都无从谈起。
再往前一步:矩阵之所以能作为一个整体被相加、相乘、求逆,始于 Cayley 1858 的矩阵代数——他把矩阵从「行列式的记法」提升成了独立的研究对象。
为什么还保留数据表身份?因为实际建模时行与列的含义决定你怎么写代码。PyTorch 的 nn.Linear 权重形状是 [out_features, in_features];若按数据表的直觉把特征放在行上,形状就会错。
为什么算子要单独拿出来?因为方阵可以反复作用、可以求逆、可以研究特征方向。 的矩阵只能做一次升维或降维,谈不上可逆。
四种身份不是四个对象,而是同一份数字的四种索引约定。选哪种,取决于你此刻要问的问题。
3.1 反事实:把 砍成 会坏在哪
第三行 看起来最没用——它只是把 原样搬到 。于是有人提议:既然最后要除以 ,不如把 存成 ,投影时手写除以 :
取 、、(相机前方 2 米、偏右半米):
和 版本一字不差。这就是这个「优化」能通过所有正向测试的原因。
坏在反向。要让贴纸贴在桌面上,你得从用户点的像素反推一条射线。 不是方阵、没有逆;两个方程三个未知数,解出来的是一条直线而不是一个点,只能把深度当自由参数硬编码。
一眼可见的坏:正向等价、反向无解。第三行不是冗余,它是唯一让 可逆的那一行。这也是为什么内参矩阵必须存成方阵,而投影公式里那个除法不能提前吸收进矩阵——一旦吸收,你就丢掉了「从像素回到世界」的能力。
顺带一提:如果为了省一次乘法把 存成 ,正向就崩了。取同一个点,用 算出的 ,得到像素 ——整幅图向画面左下角塌缩。读反行列不会让结果差一点,会让结果差一个世界。
4. 性质与推导
4.1 列是基向量的像
由矩阵乘向量的定义(第 3.2 节),取 ,只有 ,其余为 0,于是 ,即 。
由此,任意 被送到
只要知道 个基向量的像,就知道整个线性映射。这就是「列组合视角」的根源。
4.2 形状是最便宜的检查
| 运算 | 形状要求 | 结果形状 |
|---|---|---|
| 的列数 的长度 | 维向量 | |
| 的列数 的行数 | ||
| 两者形状完全相同 | 同形状 | |
| 无 |
先看形状,再算数值。 大多数实现错误在形状这一步就能抓到。
4.3 只有方阵谈得上「同一空间里的算子」
时输入输出都是 ,才能问「变换有没有逆」「有没有不被转向的方向」——这是第 3.4 节与第 6.1 节的前提。 时逆矩阵不存在,只能谈左逆或右逆。
5. 例子
5.1 手算:一份阵列,三种读法
先回到一张最小的表——用户评分,它最容易一眼看懂四种读法。取 。
数据表:2 个用户、3 个特征。小林的特征是 ,小周是 ;第一列「动作片」是 。
线性映射:。取 ,按列组合:
列向量组:、、,都在 内,任意两个不共线,所以 ,。
验证恒等式:
完全对上。 不是方阵,所以它是线性映射,不是 上的算子。
5.2 场景:权重矩阵的四种读法
一个 的线性层权重:数据表上是 4096 个输出神经元、每个 4096 个连接;线性映射是 ;算子是隐藏状态的一次混合;列向量组是 4096 个「输出方向」。参数量 ,只由形状决定。
5.3 场景闭环:一次标定,
输入: 的传感器,共 个像素;30 张棋盘格标定图,每张检出 个角点,共 个对应点。待求只有四个数:(简化模型,暂不计畸变)。
计算:每个角点给两个方程,共 个方程求 4 个未知数——超定,用最小二乘(第 4.4 节)。法方程是 的,一次求逆约 次乘加,可以忽略。真正的开销在角点检测: 个像素各扫一个 窗口,约 次乘加。
输出:四个数,外加一个验收指标——重投影误差。把 1620 个已知三维点用标定出的 投回图像,和检出的角点比距离;均方根小于 0.5 像素算通过,超过 1 像素判定失败、重拍。
成本:一帧 灰度图按 fp32 存是 MB,30 帧就是 1.5 GB,手机端必须一帧算完就丢一帧。那 次乘加,在 NPU 的 10 TOPS 上不到 1 ms,在 CPU 上要 1–2 s——「标定要等三秒」的真正来源是它,不是矩阵运算。
失败条件与兜底:
- 角点太集中:30 张图全是正对棋盘,角点几乎共面且挤在画面中央。此时 与「棋盘离镜头多远」不可分离(尺度歧义),标出的 可以任意大而复现误差一样小。兜底:要求棋盘覆盖四角,且至少 3 个倾斜姿态。
- 主点与畸变耦合:带畸变模型时 与径向畸变系数 高度相关,条件数能到 ,每次标定结果都不一样。兜底:固定主点为图像中心,只标 和 。
- 温漂:镜头模组发热会让焦距变化千分之几, 漂 3 个像素。兜底:出厂标定 + 运行时用陀螺仪做在线微调,这已经是防抖的常规做法。
6. 常见误区
-
误区:矩阵「行是输入、列是输出」。 纠正: 中 的列对应输入维度,行对应输出维度。代码
x @ W.T看起来像行向量在乘,数学上仍是 。 -
误区: 矩阵有 个列向量。 纠正:有 个列向量,每个长 ;有 个行向量,每个长 。行列数说反是最高频的错误。
-
误区:矩阵的「形状」只是显示格式。 纠正:形状决定能做哪些运算、参数量、显存与计算量。形状错,数值再对也没有意义。
7. 概念网络
- 前置:0.3 标量、向量、矩阵、张量 —— 矩阵是带两个索引的数组。
- 前置:2.4 基与维数 —— 列数对应输入空间的维数。
- 后续:3.2 矩阵乘向量 —— 把「线性映射」身份真正算出来。
- 后续:3.3 矩阵乘法 —— 两个映射的复合。
- 后续:3.4 逆矩阵与可逆性 —— 算子能不能撤销。
- 后续:3.6 转置、对称与分块 —— 行列互换的几何含义。
- 易混:1.1 向量是什么 —— 向量是一列数,矩阵是一张表;矩阵的每一列都是向量。
8. 通往大模型:权重矩阵到底存了什么
出现位置:Transformer 里几乎每个可学习参数都是矩阵。线性层 ,embedding 表 ,注意力投影 。
形状与运算:输入 ,线性层算 ,其中 。以 、FFN 中间维 为例,一个升维矩阵有 个参数。
四种身份各司其职:数据表按 [out, in] 存,方便按输出神经元取行;线性映射表示每个 token 独立做同一个变换;算子表示残差流维度不变时的 变换;列向量组表示 的第 列是「输入第 维对全部输出的影响向量」。
可检验结论:把 的行列读反,参数量不变,但输出完全不同;W @ x 与 x @ W.T 必须得到同一个向量,可用 NumPy 随机生成 、 验证。
如果这一步算错,用户会看到什么现象:行列读反,输出会向某个方向「塌缩」,表现为语义彻底乱掉,而不是轻微退化。把 embedding 表按 [D, V] 而不是 [V, D] 存,查表时按 token id 取到的其实是「所有 token 在同一个维度上的值」,模型会退化成反复输出高频词——现象像「模型变傻了」,根因却是形状。反过来,按数据表理解、把特征放在行上,X @ W 与 X @ W.T 只差一个转置,代码不报错、loss 也能降一点,但收敛明显变慢;这类「不报错的错」最难查,因为形状检查全通过了。
9. 练习
- 概念:用四种身份各写一句话描述单位阵 。哪一种身份下「不变」最直观?
- 计算:,写出三个列向量、形状,并计算 与 。
- 计算:把上面的 当数据表,2 行 3 列分别可能代表什么?转置成 后四种读法各有什么变化?
- 场景:线性层输入 768 维、输出 3072 维,权重形状是什么?参数量是多少?
- 开放:为什么矩阵的列数等于输入维数?若代码写成
x @ W而不是x @ W.T,形状检查会怎样提示你?
参考答案
- 数据表:3 个样本、3 个特征,对角线为 1;线性映射:;算子:恒等变换,每个点不动;列向量组:三个标准基向量。算子身份下「不变」最直观。
- 列向量 、、;形状 ;;。
- 2 个样本、3 个特征(两个用户对三类电影的评分)。转置后是 3 个样本、2 个特征;映射变成 ;列向量变成 3 维、只有 2 个;不再是算子(非方阵)。
- 形状 ;参数量 。
- 要求 的列数等于 的长度,列的每个分量对应一个输入维度。写
x @ W时,要求x的最后一维等于W的行数;形状报错会直接指出维度不匹配。
10. 一页速记
- 矩阵 : 行、 列, 个数。
- 物理意义 / 现实对应:矩阵是「一台把输入坐标换成输出坐标的机器」;现实里像相机的内参矩阵—— 把「米」换算成「像素」,四种身份就是四种不同的问法。
- 四种身份:数据表、线性映射 、算子()、 个列向量。
- :第 列是第 个基向量的像。
- 形状先于数值:。
- 权重矩阵按
[out, in]存,参数量由形状直接决定。
11. 参考文献与致谢
这一页的知识不是凭空来的。下面列出本页直接借用的原始工作与权威整理;正文中的人名、定理名已链接到对应条目。链接优先指向 DOI、arXiv 或可长期访问的原文存档。
- 凯莱(Arthur Cayley, 1858):A Memoir on the Theory of Matrices。第一次把矩阵当作可加、可乘、可求逆的独立对象来研究,本页「矩阵不是一堆数,而是一张有代数的表」的读法由它开端。Phil. Trans. R. Soc. (1858)
- 西尔维斯特(James Joseph Sylvester, 1850):Additions to the Articles in the September Number of this Journal, “On a New Class of Theorems,” and on Pascal’s Theorem。首次把矩形阵列称为 matrix(行列式由它「生成」),本页 §2.1 的术语即源于此。Phil. Mag. (1850)
- Horn & Johnson(2012):Matrix Analysis(第 2 版)。把「线性变换 ↔ 矩阵」的对应写成标准语言,本页「线性映射」与「算子」两种身份以它为准。Cambridge University Press
下一篇 → 3.2 矩阵乘向量:线性映射
随堂测 · 4 题
源文件:03-矩阵与线性映射/01-矩阵的四种身份.md