矩阵运算(加减乘及快速幂)

文章介绍了矩阵的基本概念,包括矩阵的定义和表示方法,并详细阐述了矩阵的加法、减法和乘法运算规则,特别提到了矩阵乘法的条件和计算方法。此外,还讨论了矩阵乘法的性质以及如何用C++实现矩阵的加、减、乘运算,并给出了矩阵乘法的重载运算符示例。最后,文章提到了矩阵快速幂这一高效算法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

基本概念

矩阵运算

✦加法✦

✦减法✦

✦乘法✦

✦快速幂✦


基本概念

矩阵(Matrix)—— 由 n 行 m 列数字构成的数表,一般用大写字母表示

记 A\in R^{n\times m},其中 R 为实数集,表示矩阵中的数都来自此集合

例如,A\in R^{2\times 2} 是一个 2\times 2 的实矩阵

A=\begin{pmatrix} 1&2 \\ 3&4 \end{pmatrix}

对于A\in R^{n\times m},矩阵中第 i 行 j 列的元素可记为 a_{ij} 或 A_{ij}

A=\begin{pmatrix} a_{11} & \cdots & a_{1m}\\ \vdots & \ddots & \vdots \\ a_{n1} & \cdots & a_{nm} \end{pmatrix}

矩阵运算

✦加法✦

\begin{pmatrix} 1 & 2 & 3\\ 4 & 5 & 6 \end{pmatrix}+\begin{pmatrix} 1 & 1 & 4\\ 5 & 1 & 4 \end{pmatrix}

=\begin{pmatrix} 1+1 & 2+1 & 3+4\\ 4+5 & 5+1 & 6+4 \end{pmatrix}

=\begin{pmatrix} 2 & 3 & 7\\ 9 & 6 & 10 \end{pmatrix}

即矩阵的对应位置上的两个元素相加

✦减法✦

 \begin{pmatrix} 4 & 5\\ 6 & 7 \end{pmatrix}-\begin{pmatrix} 1 & 2 \\ 4 & 3 \end{pmatrix}

=\begin{pmatrix} 4-1 & 5-2\\ 6-4 & 7-3 \end{pmatrix}

=\begin{pmatrix} 3 & 3\\ 2 & 4 \end{pmatrix}

与加法同理,矩阵的对应位置上的两个元素相减

✦乘法✦

矩阵乘法的定义如下:

给定两个相容的矩阵 A 和 B

如果 A=\left ( a_{ik} \right ) 是一个 m\times n 的矩阵,并且 B=\left ( b_{ik} \right ) 是一个 n\times p 的矩阵

A\in R^{n\times m},B\in R^{m\times p},C=AB\in R^{n\times p}

那么它们的积 C=AB 是一个 m\times p 的矩阵 C=\left ( c_{ij} \right )

其中,对于 i=\left \{ 1,2,\cdots,m \right \},j=\left \{ 1,2,\cdots,p \right \}

c_{ij}=\sum _{i=1}^{k} a_{ik}b_{kj}

即左矩阵 A 的列数要等与右矩阵 B 的行数,才能相乘

结果矩阵 C 中的第 i 行 j 列元素的计算方式为:

取出左矩阵 A 中第 i 行与右矩阵B的第 j 列,对应项相乘后相加

例:

A=\begin{pmatrix} 1 & 2 & 3\\ 4 & 5 & 6 \end{pmatrix}

B=\begin{pmatrix} 7 & 8\\ 9 & 10\\ 11 & 12 \end{pmatrix}

C=AB=\begin{pmatrix} 1\times7+2\times9+3\times11 & 1\times8+2\times10+3\times12\\ 4\times7+5\times9+6\times11 & 4\times8+5\times10+6\times12\ \end{pmatrix}

=\begin{pmatrix} 58 & 64\\ 139 & 154 \end{pmatrix}

根据计算规则可知,矩阵乘法一般不满足交换律,但满足结合律及对加法的分配律

●   \left ( AB \right )C=A\left ( BC \right )

●   \left ( A+B \right )C=AC+BC

●   C\left ( A+B \right )=CA+CB

代码实现

使用二维数组存储矩阵比较自然和方便,可考虑将其封装为结构体方便传参&存储信息

struct Matrix{
	int a[MAXN][MAXN];
	int n,m;
} A,B;

根据定义实现矩阵乘法如下,复杂度 O\left ( nmp \right )

for(int i=0;i<C.n;i++){
		for(int j=0;j<C.m;j++){
			C.a[i][j]=0;
			for(int k=0;k<m;k++) C.a[i][j]+=A.a[i][k]*B.a[k][j];
		}
	}

记得重载运算符以适用于Matrix运算

整个矩阵乘法代码: 

//输入时记得从0至n-1,0至m-1输入

#define MAXN 505
struct Matrix{
    int a[MAXN][MAXN];
    int n,m;
    Matrix operator + (Matrix b){ //重载 +
        Matrix c;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                c.a[i][j]=(a[i][j]+b.a[i][j]);
        c.n=n,c.m=b.m;
        return c;
    }
    Matrix operator - (Matrix b){ //重载 -
        Matrix c;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                (c.a[i][j]=a[i][j]-b.a[i][j]);
        c.n=n,c.m=b.m;
        return c;
    }
    Matrix operator * (Matrix b){ //重载 * 
        Matrix c;
        memset(c.a,0,sizeof(c.a));
        for(int i=0;i<n;i++)
            for(int k=0;k<m;k++)
                for(int j=0;j<b.m;j++)
                    c.a[i][j]=c.a[i][j]+a[i][k]*b.a[k][j];
        c.n=n,c.m=b.m;
        return c;
    }
    bool operator == (Matrix b){ //重载 == 拿来判断两个矩阵是否相等 
        if(n!=b.n||m!=b.m) return false;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                if(a[i][j]!=b.a[i][j]) return false;
        return true;
    }
    void output(){ //结构体内输出
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++) cout<<a[i][j]<<" ";
            puts("");
        }
    }
} A,B,C;

✦快速幂✦

多次进行矩阵乘即可

Luogu P3390 【模板】矩阵快速幂

Update:

2023/3/21  矩阵乘的码出锅,修改一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值