乘法我们都知道,九九乘法表我们都背过。可矩阵是由很多数组成的,矩阵乘法又是个什么鬼?
今天就带你了解一下矩阵乘法。
矩阵乘法的定义
什么矩阵可以进行乘法?
N × M N \times M N×M 的矩阵可以和 M × K M\times K M×K 的矩阵进行矩阵乘法。即:第一个矩阵的列数要和第二个矩阵的行数相等。运算得到的答案矩阵大小为 N × K N \times K N×K。
如何进行矩阵乘法?
这里我们设矩阵 C = A × B C=A\times B C=A×B, A , B , C A,B,C A,B,C 的大小分别为 N × M , M × K , N × K N\times M,M\times K,N\times K N×M,M×K,N×K。
对于 C i , j C_{i,j} Ci,j,它等于:
∑ k = 1 M A i , k ⋅ B k , j \sum_{k=1}^MA_{i,k}\cdot B_{k,j} k=1∑MAi,k⋅Bk,j
这也是要求第一个矩阵的列数要和第二个矩阵的行数相等的原因。
矩阵乘法的性质
- 满足结合律。即 A × B × C = A × ( B × C ) A\times B\times C=A\times(B\times C) A×B×C=A×(B×C)。
- 不满足交换律。即 A × B ≠ B × A A\times B\not=B\times A A×B=B×A。
讲了那么多,矩阵乘法有什么用?
矩阵乘法的妙用
矩阵乘法大多是用来加速的。比如重复的进行一个操作,就可以把操作转化成矩阵乘法,然后跑快速幂。
譬如:求斐波那契数列的第 N N N 项。
这当然可以递推,但如果 N ≤ 2 × 1 0 9 N \leq 2\times 10^9 N≤2×109 呢?
这里先放一个原题链接:AcWing 205. 斐波那契
如果递推就 Boom 了。
考虑将操作 f i = f i − 1 + f i − 2 f_i=f_{i-1}+f_{i-2} fi=fi−1+fi−2 转化成一次矩阵乘法。
我们设矩阵 F ( n ) = [ f n , f n + 1 ] F(n)=[f_n,f_{n+1}] F(n)=[fn,fn+1],且:
A = [ 0 1 1 1 ] A= \begin{bmatrix} 0 & 1 \\ 1 & 1 \end{bmatrix} A=[0111]
先给出公式:
F ( n ) = F ( n − 1 ) × A F(n)=F(n-1)\times A F(n)=F(n−1)×A
具体证明:
F ( n − 1 ) × A F(n-1)\times A F(n−1)×A
= [ f n − 1 f n ] × [ 0 1 1 1 ] =\begin{bmatrix} f_{n-1} & f_n \end{bmatrix} \times \begin{bmatrix} 0 & 1 \\ 1 & 1 \end{bmatrix} =[fn−1fn]×[0111]
= [ f n − 1 × 0 + f n × 1 f n − 1 × 1 + f n × 1 ] =\begin{bmatrix} f_{n-1}\times0+f_n\times1 & f_{n-1}\times 1+f_n\times 1 \end{bmatrix} =[fn−1×0+fn×1fn−1×1+fn×1]
= [ f n f n + 1 ] =\begin{bmatrix} f_n & f_{n+1} \end{bmatrix} =[fnfn+1]
= F ( n ) =F(n) =F(n)
因此,我们得到 F ( n ) = F ( 0 ) × A n F(n)=F(0)\times A^n F(n)=F(0)×An。这里 A n A^n An 可以用快速幂处理。
另外, N × N N\times N N×N 的矩阵 S S S 要初始化 1 1 1,相当于让 S 1 , 1 , S 2 , 2 , … , S N , N S_{1,1},S_{2,2},\dots,S_{N,N} S1,1,S2,2,…,SN,N 都赋值 1 1 1。
习题:
总结:矩阵乘法可以用于加速重复进行一个相同的操作,非常的好用。