关于矩阵运算的相关总结以及oj训练题矩阵的幂次运算

首先来认识一下矩阵乘法,矩阵乘法就是两个矩阵相乘,当然,要相乘的话还要满足一定条件——第一个矩阵的列数等于第二个矩阵的行数

具体来演示一下矩阵运算的规则:

矩阵的运算如上所示,更具体的需要去学离散数学,(大一狗表示没学呜呜),然后对于就两个矩阵相乘,代码如下:


1 for(int i=0;i<n;i++)   //矩阵c是a与b相乘得到的 
2       for(int j=0;j<p;j++) //n*p(n行p列) 
3         for(int k=0;k<m;k++)
4           c[i][j]+=a[i][k]*b[k][j];

 

 注意事项以及ac代码如下:

 1 #pragma GCC optimize(2)
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 int a[50][50];//原始输入 
 5 int b[50][50];//备份,并且最后用来输出 
 6 int c[50][50];//运算结果 
 7 int n,m;
 8 int main()
 9 {
10     cin>>n>>m;
11     for(int i=0;i<n;i++)
12     {
13         for(int j=0;j<n;j++)
14         {
15             cin>>a[i][j];
16             b[i][j]=a[i][j];//用来备份 
17         }
18     }
19     if(m==0)
20     {
21         memset(b,0,sizeof(b));
22         for(int i=0;i<n;i++)
23             b[i][i]=1;//单位矩阵,如同数的乘法中的1,相当于初始化 
24     }
25     else 
26     {
27         for(int p=0;p<m-1;p++)//m次方 
28         {
29             for(int i=0;i<n;i++)
30         {
31             for(int j=0;j<n;j++)
32             {
33                 for(int k=0;k<n;k++)
34                 {
35                     c[i][j]+=a[i][k]*b[k][j];//模拟运算 
36                 }
37             }
38         }
39         for(int i=0;i<n;i++)
40             for(int j=0;j<n;j++)
41             {
42                 b[i][j]=c[i][j];//反过来赋值,用于下一次相乘 
43                 c[i][j]=0;//回溯 
44             }
45         }
46     }
47     for(int i=0;i<n;i++)
48     {
49         for(int j=0;j<n;j++)
50         {
51             cout<<b[i][j]<<' ';
52         }
53         cout<<endl;
54     }
55     return 0;
56 }

当然,这一种是麻烦做法,

优化做法是快速幂矩阵运算,

可是,我不会( •̀ ω •́ )y

------------------------------------------------(手动分割线)

2022-4-16更

嗨嗨嗨,来了啊,时隔一个多月的我有来了,这次我学会了矩阵快速幂

对于上述求矩阵运算的要求和规则还是不变的

原理还是:给定一个m*m的矩阵,求他的矩阵^m,依靠快速幂的话,就是将矩阵看作底数进行运算就可以了

那?怎么办呢?还是要依靠矩阵乘法的原则的,在矩阵乘法的基础上,展开对于快速幂的运算

Talk is cheap. Show me the code

#include<bits/stdc++.h>
using namespace std;
struct matrix
{
    int m[40][40];
    matrix()//初始化矩阵
    {
        memset(m,0,sizeof(m));
    }
};
matrix multi(matrix a,matrix b)//矩阵乘法
{
    matrix res;
    for(register int i=0;i<30;i++)
        {
            for(register int j=0;j<30;j++)
            {
                for(register int k=0;k<30;k++)
                {
                    res.m[i][j]+=a.m[i][k]*b.m[k][j]; 
                }
            }
        }
        return res;
}
int n,m;
matrix fastm(matrix a,int m)//以二进制为依托的快速幂算法
{
    matrix res;
    for(register int i=0;i<30;i++)
    res.m[i][i]=1;//初始化矩阵,相当于让底数为1,就是前面快速幂讲的res=1
    while(m)
    {
        if(m&1)
        res=multi(res,a);
        a=multi(a,a);
        m>>=1; 
    }
    return res;
}
int main()
{
    std::ios::sync_with_stdio(false);
    cin>>n>>m;
    matrix a;
    for(register int i=0;i<n;i++)
    {
        for(register int j=0;j<n;j++)
        {
            cin>>a.m[i][j];
        }
    }
    matrix ans=fastm(a,m);
    for(register int i=0;i<n;i++)
    {
        for(register int j=0;j<n;j++)
        {
            cout<<ans.m[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

 

posted @ 2022-04-16 20:55  江上舟摇  阅读(282)  评论(0编辑  收藏  举报