矩阵乘法(Matrix Multiplication)
两个矩阵按"行×列"规则相乘:A 的每一行与 B 的每一列做点积,结果填入对应位置。本质就是把点积从"一对一"升级为"多对多"的批量运算。
核心公式
📖 符号说明
| 符号 | 含义 | 说明 | 取值范围 |
|---|---|---|---|
| 左矩阵 | m×n 矩阵 | m 行 n 列 | |
| 右矩阵 | n×p 矩阵 | n 行 p 列 | |
| 结果矩阵 | m×p 矩阵 | m 行 p 列 | |
| 结果的第 i 行第 j 列 | 等于 A 的第 i 行与 B 的第 j 列的点积 | — | |
| 求和下标 | 从 1 到 n 遍历,完成一次点积 | — |
🔢 分步计算
- 1
取 A 的第 i 行中第 k 个元素
- 2
取 B 的第 j 列中第 k 个元素
- 3
对应位置相乘
- 4
把所有乘积加起来——就是一次点积
矩阵乘法(Matrix Multiplication)
直觉理解
想象食堂午餐场景:
| 米饭(碗) | 鸡腿(个) | 青菜(份) | |
|---|---|---|---|
| 小明 | 2 | 1 | 1 |
| 小红 | 1 | 0 | 2 |
这是一个 2×3 的"点菜矩阵" A——2 个人,3 种菜。
| 热量(千卡) | 蛋白质(克) | |
|---|---|---|
| 米饭 | 200 | 4 |
| 鸡腿 | 280 | 25 |
| 青菜 | 30 | 2 |
这是一个 3×2 的"营养矩阵" B——3 种菜,2 种营养素。
现在你想知道每个人摄入了多少热量和蛋白质。怎么算?
- 小明的热量 = 2×200 + 1×280 + 1×30 = 710 千卡
- 小明的蛋白质 = 2×4 + 1×25 + 1×2 = 35 克
- 小红的热量 = 1×200 + 0×280 + 2×30 = 260 千卡
- 小红的蛋白质 = 1×4 + 0×25 + 2×2 = 8 克
每一行的计算过程,其实就是一次点积。把所有人、所有营养素一起算,就得到结果矩阵 C(2×2):
| 热量 | 蛋白质 | |
|---|---|---|
| 小明 | 710 | 35 |
| 小红 | 260 | 8 |
这就是矩阵乘法——A 的每一行与 B 的每一列做点积,结果填入对应位置。
公式定义
矩阵 A(m×n)乘以矩阵 B(n×p),得到矩阵 C(m×p):
Cij=k=1∑nAik⋅Bkj用一句话读这个公式:结果矩阵第 i 行第 j 列的数 = 左矩阵第 i 行 · 右矩阵第 j 列(做点积)。
维度匹配规则
矩阵乘法有一个必须满足的条件:A 的列数必须等于 B 的行数。
Am×n⋅Bn×p=Cm×p回到食堂的例子:点菜矩阵有 3 列(3 种菜),营养矩阵有 3 行(3 种菜的营养)——这个"3"必须对上,否则乘法没有意义。
一个好记的口诀:消内留外——中间的 n 在计算中被"消掉"了(求和),留下的外侧 m 和 p 决定结果的形状。
不满足交换律
矩阵乘法一般不满足交换律:A×B=B×A。
这和普通数字乘法不一样。原因很直观:A×B 是"A 的行配 B 的列",反过来 B×A 是"B 的行配 A 的列"——配对的对象都变了,结果当然不同。甚至可能一个方向能乘,反过来维度就对不上,根本不能乘。
动手试试
点击结果矩阵中的任意格子,观察它由左矩阵的哪一行和上矩阵的哪一列做点积得到。高亮的行和列就是参与计算的向量。
矩阵乘法:批量点积
与点积的关系
| 操作 | 输入 | 输出 | 本质 |
|---|---|---|---|
| 点积 | 两个向量 | 一个标量 | 一次"对应相乘再求和" |
| 矩阵乘法 | 两个矩阵 | 一个矩阵 | 批量点积 |
矩阵乘法 = 把点积从"一对一"扩展到"多对多"。理解了点积,矩阵乘法只是规模的放大。
这在机器学习中用来做什么
机器学习的核心运算几乎都是矩阵乘法:一批数据同时通过一层网络、一组向量同时计算两两相似度……矩阵乘法让这些本质是"重复做点积"的操作可以一步完成,也是 GPU 能大幅加速深度学习的根本原因。
引用本概念的文章