矩阵
矩阵基础
矩阵的定义
矩阵(\(\text{matrix}\))是一个按照行与列排列出的元素表。
元素通常是来自于某个数系或代数结构的,例如实数域 \(\mathbb{R}\),整数环 \(\mathbb{Z}\) 或模 \(MOD\) 的整数环 \(\mathbb{Z}_{MOD}\)。
我们记一个矩阵 \(A\) 为:
- \(A\) 有 \(n\) 行 \(m\) 列,称为一个 \(n\times m\) 矩阵,记作 \(A\in F^{n\times m}\)(\(F\) 是元素集合)。
- 第 \(i\) 行第 \(j\) 列元素记为 \(A_{i,j}\) 或 \(a_{i,j}\)。
行向量和列向量
当矩阵只有一行或一列时,它们是向量的矩阵表示:
- 行向量:\(1\times m\),例如 \(\begin{pmatrix}x_1 & x_2 & \cdots & x_m\end{pmatrix}\)。
- 列向量:\(n\times 1\),例如 \(\begin{pmatrix}x_1\\x_2\\\vdots\\x_n\end{pmatrix}\)。
常见特殊矩阵
- 方阵(\(\text{square matrix}\)):\(n\times n\)。
- 零矩阵(\(\text{zero matrix}\)):全为 \(0\),记作 \(0\)。
- 单位矩阵(\(\text{identity matrix}\)):\(I_n\),满足主对角线为 \(1\),其余为 \(0\):
- 对角矩阵:仅主对角线可能非零。
- 上(下)三角矩阵:主对角线下方(上方)为零。
- 稀疏矩阵(\(\text{sparse matrix}\)):大部分元素为零。
矩阵与线性映射
一个 \(n\times m\) 矩阵可以视为从 \(F^m\) 到 \(F^n\) 的线性变换。
若 \(\mathbf{x}\in F^m\) 是列向量,则 \(A\mathbf{x}\in F^n\),并且
矩阵乘法的定义正是为了让「变换的复合」能用矩阵表示:若先做 \(B\),再做 \(A\),则复合变换用 \(AB\) 表示,并满足
矩阵乘法
矩阵乘法的维度匹配
若 \(A\in F^{n\times m}\),\(B\in F^{m\times p}\),则 \(AB\) 有定义, 且 \(AB\in F^{n\times p}\)。
维度匹配条件是:
标准矩阵乘法定义
设 \(A\in F^{n\times m}\),\(B\in F^{m\times p}\)。定义 \(C=AB\) 为 \(n\times p\) 矩阵,且
也就是大家常说的「左行右列」。
矩阵乘法性质
- 结合律:
这也是我们可以用「快速幂」来计算矩阵乘法的根本依据。
- 分配律:
- 一般不满足交换律:
单位矩阵满足:
复杂度与快速幂
朴素矩阵乘法复杂度
朴素矩阵乘法的复杂度是很好分析的, 对 \(n\times n\) 方阵,朴素乘法时间复杂度为:\(O(n^3)\)。
值得一提的是学术界存在复杂度小于 \(O(n^3)\) 的矩阵乘法计算方式, 只不过这些计算方式实现起来十分复杂而且常数很大, 在算法竞赛领域我们通常来说只使用朴素的 \(O(n^3)\) 计算方式。
矩阵的幂运算
对方阵 \(A\in F^{n\times n}\),定义:
矩阵快速幂
矩阵快速幂本质上和常规的快速幂并无较大的差别, 唯一的差别在于我们把普通的整数之间的乘法换成了矩阵的乘法。
快速幂需要 \(O(\log k)\) 次矩阵乘法,因此复杂度为:\(O(n^3\log k)\)。
矩阵乘法与路径问题
标准乘法
是具有「拼接」结构的,我们可以去枚举 \(k\),把 \(i\to k\) 的信息和 \(k\to j\) 的信息合成 \(i\to j\) 的信息, 再对所有的 \(k\) 进行聚合,这样一来就能得到全局的 \(i\to j\) 的信息。
给定有向图 \(G\)(点集 \(\{1,\dots,n\}\)),定义邻接矩阵 \(A\in\{0,1\}^{n\times n}\):
对任意 \(k\ge 1\),成立:
核心原因是因为:
矩阵乘法与传递闭包
把运算替换为布尔逻辑:
- “加法”替换为 \(\lor\);
- “乘法”替换为 \(\land\)。
定义布尔矩阵乘法:
此时
表示存在至少一条长度恰为 \(k\) 的路径可以从 \(i\) 走到 \(j\)。
定义传递闭包:
于是
min-plus 矩阵乘法
在该体系下的矩阵乘法:
我们令带权邻接矩阵 \(W\in(\mathbb{R}\cup\{+\infty\})^{n\times n}\):
则在 \(\text{min-plus}\) 意义下:
闭包: