核心概述:提供对方阵的基础操作(矩阵乘法、向量乘法与幂运算)的泛型矩阵类型,用于表示与计算线性变换与线性递推。
原文引述:
Description: Basic operations on square matrices. Usage: Matrix<int, 3> A; A.d = {{{{1,2,3}}, {{4,5,6}}, {{7,8,9}}}}; array<int, 3> vec = {1,2,3}; vec = (A^N) * vec; Status: tested
展开阐述:
- 定义与数据结构
- 模板定义:template<class T, int N> struct Matrix,内部以 array<array<T, N>, N> d 存储 N×N 方阵。
- 通过类型参数 T 指定元素类型(如 int/long long/模数域元素等),通过非类型参数 N 固定维度。
- 接口与操作语义(据实现)
- 矩阵乘法:M operator*(const M& m) const
- 标准三重循环,C[i][j] = Σ_k A[i][k] * B[k][j]。
- 矩阵与向量乘法:array<T,N> operator*(const array<T,N>& vec) const
- 逐行点乘,res[i] = Σ_j A[i][j] * vec[j]。
- 快速幂:M operator^(ll p) const
- 要求 p ≥ 0;采用二进制快速幂:a 置为单位矩阵 I,b 置为当前矩阵;按位检查 p,如果该位为 1 则 a = a * b;每步 b = b * b;p 右移,返回 a。
- 矩阵乘法:M operator*(const M& m) const
- 复杂度与边界条件
- 乘法 O(N^3),向量乘法 O(N^2),快速幂 O(log p) 次矩阵乘法总计 O(N^3 log p)。
- 幂的底为方阵,p=0 时返回单位矩阵;p>0 返回相应幂次。
- 元素类型 T 需闭合于加法与乘法;注意溢出(如使用 long long 时的乘加溢出风险)。
- 实现细节与工程要点
- 单位矩阵构造:对角线置 1,其余置 0;确保作为快速幂的幺元。
- 若在模数域下运算,请在乘加时取模,保证数值稳定。
- 若 N 较大,可考虑分块乘法或其他优化(本节点保持基础实现)。
- 适用场景与对比
- 线性递推:将状态转移写成矩阵,使用 (A^N) * 初始向量 快速求解第 N 步结果。
- 相较 114-数值算法-线性方程求解 聚焦于解 Ax=b 的线性系统,本节点聚焦于矩阵代数运算与幂次变换;若需求逆,参见 107-数值算法-矩阵求逆。
- 正确性直觉
- 矩阵乘法满足结合律,快速幂在半群结构下成立;单位矩阵作为乘法幺元保证 0 次幂合理性。