矩阵

Wed Dec 18 2024
6 minutes

0.矩阵#

既然讲矩阵就没必要讲向量了吧

定义一个形如 A=[a1,1a1,2a1,na2,1a2,2a2,nam,1am,2am,n]A = \begin{bmatrix} a _ {1,1} & a _ {1,2} & \ldots & a _ {1,n} a _ {2,1} & a _ {2,2} & \ldots & a _ {2,n} \vdots & \vdots & \ddots & \vdots a _ {m,1} & a _ {m,2} & \ldots & a _ {m,n} \end{bmatrix} 的数表叫做一个矩阵。矩阵实际上就是 nn 个行向量或 mm 个列向量的组合。

运算#

A,B,CA,B,Cn×mn \times m 的矩阵,DDm×km \times k 的矩阵, EEn×kn \times k 的矩阵

A±B=[a1,1±b1,1a1,2±b1,2a1,n±b1,na2,1±b2,1a2,2±b2,2a2,n±a2,nam,1±bm,1am,2±bm,2am,n±bm,n]E=CD,Ei,j=l=1mCi,lDl,jA \pm B = \begin{bmatrix} a _ {1,1} \pm b _ {1,1} & a _ {1,2} \pm b _ {1,2} & \ldots & a _ {1,n} \pm b _ {1,n} a _ {2,1} \pm b _ {2,1} & a _ {2,2} \pm b _ {2,2} & \ldots & a _ {2,n} \pm a _ {2,n} \vdots & \vdots & \ddots & \vdots a _ {m,1} \pm b _ {m,1} & a _ {m,2} \pm b _ {m,2} & \ldots & a _ {m,n} \pm b _ {m,n} \end{bmatrix} E = CD,E _ {i,j} = \sum _ {l = 1} ^ m C _ {i,l} D _ {l,j}

其中,加减法满足交换律与结合律,乘法 仅满足结合律

加法单位元为零矩阵 On,m=[000000]O _ {n,m} = \begin{bmatrix} 0 & 0 & \ldots & 0 \vdots & \vdots & \ddots & \vdots 0 & 0 & \ldots & 0 \end{bmatrix},乘法仅在 n=mn = m 时存在单位元为单位矩阵 In=[100010001]I _ n = \begin{bmatrix} 1 & 0 & \ldots & 0 0 & 1 & \ldots & 0 \vdots & \vdots & \ddots & \vdots 0 & 0 & \ldots & 1 \end{bmatrix}

与群相关#

矩阵运算结果仍是矩阵,满足封闭性,还满足结合律,两个运算均有单位元与逆元,设所有矩阵的集合为 MM,则 G(M,+,×)G(M,+,\times) 是一个群。

你甚至可以用线段树来维护这东西

矩阵快速幂#

详见这里

矩阵求逆#

定义满足 AA1=A1A=IAA^ {-1} = A ^ {-1}A = I 的矩阵 A1A ^ {-1} 为矩阵 AA 的逆。

由逆元的性质得,这玩意可以当作矩阵的“除法”。

但是,这个东西不一定存在,存在的充要条件如下:

  1. BB 为任意 nn 维向量,线性方程组 Ax=BAx = B 的解存在且唯一。
  2. AA 为有限个初等矩阵的积。

求矩阵逆可以用高斯消元法,但我更喜欢用 Gauss-Jordan 消元法,它的目的是将原矩阵化为单位矩阵。

线性方程组求解#

任一线性方程组都能被写成 AX=BAX = B 的形式,AA 为系数矩阵,X,BX,B 为两个向量。

回忆我们解方程组的过程,用到了加减消元和代入消元,并且只会操作系数,所以我们可以把系数全部提取出来,单独进行计算。

具体的,就是把 A,BA,B 写为 [AB]\begin{bmatrix} A & B \end{bmatrix} 的增广矩阵的形式,只对系数进行操作。

Gauss-Jordan 消元是这样的:先选取每一列绝对值最大的当作主元,然后进行对换变换,再将主元化为 11,最后对每一行进行加减消元将这一列化为 00 就好了。

逆矩阵的定义是 AA1=IAA ^ {-1} = I,所以我们可以直接写出 [AI]\begin{bmatrix} A & I \end{bmatrix} 的增广矩阵,对其进行消元后就是 [IA1]\begin{bmatrix} I & A ^ {-1} \end{bmatrix},就解出来了。

1.在 OI 中的应用#

优化 DP#

有些 DP 的转移可以被抽象成群上的运算,并且是类似 OPTk=1nAi,koptBk,jOPT _ {k = 1} ^ nA _ {i,k} opt B _ {k,j} 的,所以可以找出一个转移矩阵,然后用矩阵快速幂将 O(n)\Omicron(n) 的转移优化为 O(logn)\Omicron(\log n) 的。

为此,我们可以定义广义矩阵乘法。本质上就是群上的一个二元运算,前提是该运算具有结合律。

比如这道,可以定义 C=A×B,Ci,j=mink=1nAi,k+Bk,jC = A \times B,C _ {i,j} = \min _ {k = 1} ^ nA _ {i,k} + B _ {k,j},两个运算都有结合律,并且外层运算对内层运算有分配律,可以用快速幂。

动态 DP 中,广义矩阵乘法很常用。

连通性邻接矩阵的幂的意义之前写过了

Tricks#

1.拆点#

因为连通性邻接矩阵只能存 0/1 (或者有重边可以更多),而有些题是带边权并且一般很小。这个时候我们就可以拆点,把 uu 拆成 (u1,u2,,uW)(u _ 1,u _ 2,\ldots,u _ W),同时 i[1,W),ui+1\forall i \in [1,W), u _ {i + 1}uiu _ i 连边,对于 uuvv 的边权为 ww 的边,从 u1u _ 1vwv _ w 连边,然后就可以正常求幂了。

2.点边互换#

这道题中,需要记录边的状态而非点的状态。这个时候我们可以考虑用边来当作状态。

dpi,jdp _ {i,j} 表示从 aa 开始,终边为 ii,长度为 jj 的路径方案数,则有转移方程:dpi,j=uEidpu,j1dp _ {i,j} = \sum _ {u \in E _ i} dp _ {u,j - 1},其中 EiE _ i 表示指向 ii 的起点的所有边的集合。

然后可以将第二维滚掉,用矩阵快速幂优化。设 FF 为初始矩阵, BB 为转移矩阵,则答案矩阵 Ans=FBt1Ans = FB ^ {t - 1},答案为 iEbAnsi\sum _ {i \in E _ b} Ans _ i