矩阵

我补药学数学口牙😭根本看不懂

大纲:矩阵运算、矩阵快速幂

矩阵运算

直接上:

\[ \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列交点位置的值
image

\[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;
}
posted @ 2025-07-14 15:42  Cheese_XD  阅读(2)  评论(0)    收藏  举报