标签:
两矩阵 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