矩阵乘法

矩阵乘法定义

矩阵可以看成一个二维数组,\(A_{i,j}\) 表示第 \(i\) 行第 \(j\) 列的元素。

一般来说,定义广义上的加法 \(\oplus\) 和乘法 \(\otimes\),那么矩阵乘法定义如下:

\(A\)\(P\times M\) 的矩阵,\(B\)\(M\times Q\) 的矩阵,\(C=AB\)\(P\times Q\) 的矩阵,那么有,

\[C_{i,j}=\bigoplus_{k=1}^{M}A_{i,k}\otimes B_{k,j} \]

尝试证明矩阵乘法具有结合律,即

\[(AB)C=A(BC) \]

也即对任意 \(i,j\),有,

\[((AB)C)_{i,j}=(A(BC))_{i,j} \]

容易得到(方便起见,这里设矩阵均为 \(N\times N\) 的)

\[\begin{aligned} ((AB)C)_{i,j} &=\bigoplus_{s=1}^{N}(AB)_{i,s}\otimes C_{s,j}\\ &=\bigoplus_{s=1}^{N}\left(\bigoplus_{t=1}^{N}A_{i,t}\otimes B_{t,s}\right)\otimes C_{s,j} \end{aligned} \]

\[\begin{aligned} (A(BC))_{i,j} &=\bigoplus_{t=1}^{N}A_{i,t}\otimes (BC)_{t,j}\\ &=\bigoplus_{t=1}^{N}A_{i,t}\otimes \left(\bigoplus_{s=1}^{N}B_{t,s}\otimes C_{s,j}\right)\\ \end{aligned} \]

\(\otimes\)\(\oplus\) 有分配律和结合律,则有

\[((AB)C)_{i,j}=(A(BC))_{i,j}=\bigoplus_{s=1}^{N}\bigoplus_{t=1}^{N}A_{i,s}\otimes B_{s,t}\otimes C_{t,j} \]

对于一般的 \((+,\times)\) 矩阵乘法,后者对前者有分配律和结合律,因此一般定义的矩阵乘法具有结合律。

众所周知矩阵乘法可以优化 DP,例如斐波那契数列的递推;同时单点修改的 DP 可以用线段树维护,称之为 DDP(线段树维护的东西需要有结合律,不然没法设计 tag)。

对于更一般的 DP,可能需要广义的矩乘,例如 \((\max,+)\) 等。

矩阵乘法优化 DP

Eg.1 线性递推函数

最经典的问题是求斐波那契数列的第 \(n\) 项。

我们知道,

\[F_0=0,F_1=1,F_{n+1}=F_{n}+F_{n-1}\quad(n>0) \]

不妨将递推时的关键信息放到向量里,类似:

\[\begin{bmatrix}F_{n-1} & F_{n} \cr\end{bmatrix} \]

我们希望得到转移矩阵 \(T\),使得,

\[\begin{bmatrix}F_{n-1} & F_{n} \end{bmatrix}\times T=\begin{bmatrix}F_{n} & F_{n+1} \end{bmatrix} \]

观察得:

\[T=\begin{bmatrix} 0 & 1 \\ 1 & 1 \end{bmatrix} \]

由于矩阵乘法具有结合律,

\[\begin{bmatrix}F_{n} & F_{n+1} \cr\end{bmatrix}=\begin{bmatrix}F_{0} & F_{1} \cr\end{bmatrix}\times T^n \]

类似地,其他递推函数也可以这样处理,若矩阵是 \(k\times k\) 的,则复杂度为 \(O(k^3\log n)\)

Eg.2 其他递推数列

考虑

\[f_{n+1}=3f_{n}+4f_{n-1}+2^{n}+5 \]

这种递推关系不是线性递推,因此不能只用 \(f_{n}\)\(f_{n-1}\) 组成的向量。

考虑记录向量:

\[\begin{bmatrix}f_n & f_{n-1} & 2^n & 1\end{bmatrix} \]

我们希望推到:

\[\begin{bmatrix}f_{n+1} & f_{n} & 2^{n+1} & 1\end{bmatrix} \]

容易得到转移矩阵为

\[\begin{bmatrix} 3 & 1 & 0 & 0 \\ 4 & 0 & 0 & 0 \\ 1 & 0 & 2 & 0 \\ 5 & 0 & 0 & 1 \\ \end{bmatrix} \]

Eg.3 矩阵维护动态 DP

动态 DP,也即带修改的 DP。

// TODO

posted @ 2024-09-04 10:58  weilycoder  阅读(35)  评论(0编辑  收藏  举报