初学矩阵乘法
前言
何谓矩阵乘法?就是矩阵之间的乘法。
矩阵乘法并不是简单地将两个矩阵中对应位置上对应元素相乘,而是更为复杂。
矩阵乘法应用广泛,典例就是优化递推。
矩阵乘法
首先我们要知道,矩乘是一个\(n*m\)的矩阵乘上一个\(m*k\)的矩阵,得到一个\(n*k\)的矩阵。
由此容易发现,矩乘是不满足交换律的。
其中,第一个矩阵第\(x\)行的元素,与第二个矩阵第\(y\)列的元素,逐一对应相乘之后再取得的和,就是答案矩阵中第\(x\)和第\(y\)列的值。
用式子表示,就是:
\[res_{x,y}=\sum_{i=1}^mA_{x,i}\cdot B_{i,y}
\]
用代码表示,就是:(注意,字母表示有点出入)
inline Mat operator * (const Mat& A,const Mat& B)
{
Mat res(A.n,B.m);register int i,j,k;
for(k=1;k<=A.m;++k) for(i=1;i<=A.n;++i)
for(j=1;j<=B.m;++j) res.v[i][j]+=A.v[i][k]*B,v[k][j];
return res;
}
矩阵快速幂
矩阵快速幂与普通的快速幂类似,主要是要注意答案初始化的问题,一般会初始化为左上-右下对角线上都是\(1\),其他位置都是\(0\)。
做矩阵快速幂的矩阵应该是形如\(n*n\)的矩阵。
代码实现如下:
inline Mat operator ^ (Mat x,int y)
{
Mat t(x.n,x.n);for(int i=1;i<=t.n;++i) t.v[i][i]=1;
W(y) y&1&&(t=t*x,0),x=x*x,y>>=1;return t;
}
应用
对于一个递推式,我们可以通过求出其转移矩阵,然后矩阵快速幂来快速求出答案。
而在一些数据结构中也可以用它来较好地维护信息。
待到再迷茫时回头望,所有脚印会发出光芒