矩阵运算 (Matrix Operations)

1. 定义

矩阵运算是对二维数组(矩阵)做的一系列数学操作:加减、数乘、矩阵乘法、转置、求逆、行列式等。在 Python 里主要用 NumPy 实现,深度学习 / 机器学习 / 图形学的底层几乎全是矩阵运算。

关键区分:矩阵运算里最容易混的是 逐元素乘法(对应位置相乘)矩阵乘法(行乘列求和)——它们是完全不同的两件事,见第 4 节。

2. 基本概念

概念说明
标量 (scalar)单个数,如 5
向量 (vector)一维数组,如 [1,2,3],形状 (3,)
矩阵 (matrix)二维数组,形状 (行, 列) = (m, n)
形状 (shape)(m, n) 表示 m 行 n 列
转置 (transpose)行列互换,(m,n)(n,m)
单位矩阵 (identity)对角线为 1、其余为 0,乘任何矩阵不变

3. 逐元素运算(element-wise)

形状相同的矩阵,对应位置直接运算:

import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
 
A + B        # 逐元素加 [[6,8],[10,12]]
A - B        # 逐元素减
A * B        # 逐元素乘(Hadamard 积,不是矩阵乘!)[[5,12],[21,32]]
A / B        # 逐元素除
A ** 2       # 逐元素平方
A * 3        # 数乘(每个元素乘 3)

⚠️ A * B逐元素乘,不是数学意义的矩阵乘法。矩阵乘要用 @np.dot(见下)。

4. 矩阵乘法(最重要,也最易错)

数学上的矩阵乘法:(m,k) @ (k,n) = (m,n)左边的列数必须等于右边的行数

A = np.array([[1, 2], [3, 4]])      # (2, 2)
B = np.array([[5, 6], [7, 8]])      # (2, 2)
 
A @ B            # 矩阵乘法(推荐写法)[[19,22],[43,50]]
np.dot(A, B)     # 等价
np.matmul(A, B)  # 等价

形状规则示例:

X = np.random.randn(3, 4)   # (3, 4)
W = np.random.randn(4, 2)   # (4, 2)
Y = X @ W                    # (3, 2) —— 中间的 4 抵消
# X @ W 合法(4==4);W @ X 报错(2 != 3)

记忆法:(m, **k**) @ (**k**, n) —— 相邻的两个 k 必须相等、会被”消掉”,剩下 (m, n)。这是神经网络前向传播的核心(输入 @ 权重)。

5. 转置、求逆、行列式等

A.T                  # 转置(行列互换)
np.transpose(A)      # 等价
 
np.linalg.inv(A)     # 求逆矩阵(要求方阵且可逆)
np.linalg.det(A)     # 行列式
np.trace(A)          # 迹(对角线元素之和)
np.eye(3)            # 3x3 单位矩阵
np.linalg.solve(A, b)  # 解线性方程组 Ax = b(比先求逆再乘更稳更快)
 
np.linalg.eig(A)     # 特征值和特征向量
U, S, Vt = np.linalg.svd(A)   # 奇异值分解 (SVD)

解方程 Ax=bnp.linalg.solve(A, b),别用 inv(A) @ b——后者数值上更不稳、更慢。

6. 常用聚合与轴 (axis)

A.sum()              # 所有元素求和
A.sum(axis=0)        # 沿行方向压缩 → 每列的和(结果长度=列数)
A.sum(axis=1)        # 沿列方向压缩 → 每行的和(结果长度=行数)
A.mean(axis=0)       # 每列均值
A.max(axis=1)        # 每行最大值

axis=0 是”跨行”(纵向,结果按列);axis=1 是”跨列”(横向,结果按行)。这是新手最常搞反的点:axis 指的是”被压缩掉的那个维度”

7. 常见坑

  • * 当成矩阵乘A * B 是逐元素乘;矩阵乘用 @(头号坑)
  • 形状不匹配@ 要求内维相等;(m,k)@(k,n) 才行,报 shapes not aligned 就是维度对不上
  • 一维向量的歧义(3,) 既不是行向量也不是列向量;需要明确时用 reshape(-1,1)(列)或 reshape(1,-1)(行)
  • inv 求不可逆矩阵:奇异矩阵没有逆,会报错;实际中优先用 solve / 伪逆 pinv
  • axis 用反axis=0 vs axis=1 记混,结果维度就错了
  • 整数矩阵除法:整型数组做除法可能被截断,需要时先转 float

8. 延伸阅读 / 关联概念

  • NumPy 基础 — 矩阵运算的载体;见 numpy-basics.md
  • 广播机制 (Broadcasting) — 形状不同的数组如何自动对齐运算;见 broadcasting.md
  • PyTorch — 张量运算 API 和 NumPy 高度一致,@ 同样是矩阵乘;见 torch.md
  • 线性代数 / 矩阵秩 — 矩阵运算的数学基础(特征值、SVD、秩);秩单独成篇见 ../linear-algebra/matrix-rank.md
  • 官方文档:https://numpy.org/doc/stable/reference/routines.linalg.html