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

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

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

关于矩阵运算的相关总结以及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];

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

 

 注意事项以及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

 

上一篇:时钟分频器


下一篇:单片机c语言组数怎么用,怎么定义和赋值