码迷,mamicode.com
首页 > 其他好文 > 详细

矩阵乘法以及矩阵快速幂模板

时间:2015-04-21 07:04:15      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

两矩阵 A * B ,当 A 的行数等于 B 的列数时,A * B 合法,结果如下:

 1 #include<stdio.h>
 2 #include<string.h>
 3 
 4 struct mat{
 5     int r,c;          //r即row,矩阵行数;c即column,矩阵列数
 6     int m[10][10];    //矩阵
 7 };
 8 
 9 mat MatMul(mat m1,mat m2){    //仅当m1.r==m2.c时可以相乘,相乘时可加模运算
10     mat tmp;
11     tmp.r=m1.r;        //计算结果的行数与m1行数相等,列数与m2列数相等
12     tmp.c=m2.c;
13     int i,j,k;
14     for(i=1;i<=tmp.r;i++){
15         for(j=1;j<=tmp.c;j++){
16             int t=0;
17             for(k=1;k<=m1.c;k++){
18                 t+=m1.m[i][k]*m2.m[k][j];
19             }
20             tmp.m[i][j]=t;
21         }
22     }
23     return tmp;
24 }
25 
26 int main(){
27     int t;
28     while(scanf("%d",&t)!=EOF){
29         mat m[2];
30         for(int i=0;i<=1;i++){
31             scanf("%d%d",&m[i].r,&m[i].c);
32             for(int j=1;j<=m[i].r;j++){
33                 for(int k=1;k<=m[i].c;k++){
34                     scanf("%d",&m[i].m[j][k]);
35                 }
36             }
37         }
38         mat ans=MatMul(m[0],m[1]);
39         for(int i=1;i<=ans.r;i++){
40             for(int j=1;j<=ans.r;j++){
41                 printf("%d ",ans.m[i][j]);
42             }
43             printf("\n");
44         }
45     }
46     return 0;
47 }
48     

 

在之前的矩阵乘法的基础上,引入快速幂的思想,就得到了矩阵的快速幂算法(MatQP,计算矩阵 a 的 n 次幂):

 1 struct mat{
 2     int r,c;
 3     int m[10][10];
 4 };
 5 
 6 mat MatMul(mat m1,mat m2){
 7     mat tmp;
 8     tmp.r=m1.r;
 9     tmp.c=m2.c;
10     int i,j,k;
11     for(i=1;i<=tmp.r;i++){
12         for(j=1;j<=tmp.c;j++){
13             int t=0;
14             for(k=1;k<=m1.c;k++){
15                 t+=m1.m[i][k]*m2.m[k][j];
16             }
17             tmp.m[i][j]=t;
18         }
19     }
20     return tmp;
21 }
22 
23 mat MatQP(mat a,int n){
24     mat ans,tmp=a;
25     ans.r=ans.c=a.r;
26     memset(ans.m,0,sizeof(ans.m));
27     for(int i=1;i<=ans.r;i++){
28         ans.m[i][i]=1;
29     }
30     while(n){
31         if(n&1)ans=MatMul(ans,tmp);
32         n>>=1;
33         tmp=MatMul(tmp,tmp);
34     }
35     return ans;
36 }

 

矩阵乘法以及矩阵快速幂模板

标签:

原文地址:http://www.cnblogs.com/cenariusxz/p/4443176.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!