矩阵
我补药学数学口牙😭根本看不懂
大纲:矩阵运算、矩阵快速幂
矩阵运算
直接上:
\[
\left[
\begin{matrix}
1 & 1 & 4\\
5 & 1 & 4\\
\end{matrix}
\right]
\times
\left[
\begin{matrix}
1 & 9 \\
1 & 9 \\
8 & 1 \\
\end{matrix}
\right]
=
\left[
\begin{matrix}
32 & 22 \\
37 & 58 \\
\end{matrix}
\right]
\]
\[C[i][j]=\sum_{k=1}^n A[i][k]*B[k][j]
\]
注意:第一个矩阵的列数要等于第二个矩阵的行数.
其中,\(n\)表示第一个矩阵行数or第二个矩阵的行数(上例中,\(n=3\))
说人话:A的一行分别乘B的一列,求和,得到答案C中A行与B列交点位置的值

\[C[1][1]=A[1][1]\times B[1][1] + A[1][2] \times B[2][1] +A[1][3]\times B[3][1]
\]
\[\Rightarrow C[1][1]=1\times 1 + 1\times 1+4\times 8 =32
\]
单位矩阵:除了对角线(左上到右下)为1,其他位置为0的矩阵.
类似乘法中的1:任意一矩阵A乘单位矩阵都等于A本身.
\[\left[
\begin{matrix}
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1 \\
\end{matrix}
\right]
\]
定义矩阵:
const int N=100;
struct Matrix{
int w,h,val[N][N]; //w行h列
inline int* operator [](const int i) {
return val[i];
}
};
初始化代码:
Matrix init(int x,int y,int op) //长x宽y,op为1则为单位矩阵,op为0就初始成全0
{
Matrix res;
res.w=x,res.h=y;
for(int i=1;i<=x;i++){
for(int j=1;j<=y;j++){
if(op==1) res[i][j]=(i==j);
else res[i][j]=0;
}
}
return res;
}
乘法代码:
Matrix mul(Matrix A,Matrix B) //要求A.w==B.h
{
Matrix res;
res=init(2,2,0); //记得初始化(切记!!)
for(int i=1;i<=A.w;i++){
for(int j=1;j<=B.h;j++){
for(int k=1;k<=A.h;k++){
res[i][j]+=A[i][k]*B[k][j];
}
}
}
return res;
}
矩阵快速幂
显然矩阵乘法是\(O(n^3)\)的. 为了让矩阵幂跑得比🐌快一些,我们通常给矩阵幂套个快速幂模板.
Matrix quickpow(Matrix base,ll x)
{
Matrix res=init(2,2,1); //定义一个2*2的单位矩阵
while(x){
if(x&1) res=mul(res,base);
base=mul(base,base);
x>>=1;
}
return res;
}

浙公网安备 33010602011771号