矩阵乘法

转载 2016年08月28日 21:05:39

【矩阵乘法入门】  http://blog.csdn.net/mig_davidli/article/details/8601304

这算是我个人的学习笔记吧,再简单的看了【矩阵乘法入门以后】,去百度文库上查了下矩阵乘法的应用,挺不错的。

首先练习了一下 poj  3233 。 http://poj.org/problem?id=3233

 这道题的矩阵求和 应用了两次二分,很灵活。 

题意 : S = A^1 + A^2 + A^3 + ... + A^k;

因为   A^4  = A^A^A^A =( A^2 ) ^2;  所以可以应用二分求解 A^x;

又因为 A^1 + A^2 + A^3 + A^4 + A^5 + A^6 +A^7 = (A^1 + A^2 + A^3) + A^4+A^4*(A^1 + A^2 + A^3);

  1. #include<iostream>  
  2. #include<cstring>  
  3. #include<cstdio>  
  4. using namespace std;  
  5. #define maxn 36  
  6. int n, k, m;  
  7. struct Mar  
  8. {  
  9.   int  map[maxn][maxn];  
  10.   void unit()  ///单位矩阵  
  11.   {  
  12.       for(int i=0;i<maxn;i++)  
  13.         map[i][i] = 1;  
  14.   }  
  15.   void zero() ///零矩阵  
  16.   {  
  17.       memset(map,0,sizeof(map));  
  18.   }  
  19. }x;  
  20. Mar operator +(const Mar &a,const Mar &b)  
  21. {  
  22.     Mar tmp;  
  23.     tmp.zero();  
  24.     int i,j;  
  25.     for(i=0;i<n;i++)  
  26.     for(j=0;j<n;j++){  
  27.         tmp.map[i][j] =a.map[i][j] + b.map[i][j];  
  28.         if(tmp.map[i][j]>=m) tmp.map[i][j]%=m;  
  29.     }  
  30.     return tmp;  
  31. }  
  32. Mar operator *(const Mar &a,const Mar &b)  
  33. {  
  34.     Mar tmp;  
  35.     tmp.zero();  
  36.     int i,j,k;  
  37.     for(k=0;k<n;k++)  
  38.     for(i=0;i<n;i++)  
  39.       ///  if(a.map[i][k])  
  40.     for(j=0;j<n;j++){  
  41.          tmp.map[i][j] += a.map[i][k] * b.map[k][j];  
  42.          if(tmp.map[i][j]>=m)  
  43.         tmp.map[i][j]%=m;  
  44.     }  
  45.     return tmp;  
  46. }  
  47. Mar operator ^ (Mar x,int n)  
  48. {  
  49.     Mar tmp;  
  50.     tmp.zero();  
  51.     tmp.unit();  
  52.     while(n){  
  53.         if(n%2==1) tmp = tmp *x;  
  54.         n/=2;  
  55.         x = x*x;  
  56.     }  
  57.     return tmp;  
  58. }  
  59. Mar sum(int n)  
  60. {  
  61.     if(n==1) return x;  
  62.     else {  
  63.         Mar tmp = sum(n/2);  
  64.         if(n%2==1){  
  65.             Mar tmp2 = x ^ ((n/2)+1);  
  66.             return tmp + tmp2 + tmp*tmp2;  
  67.         }  
  68.         else {  
  69.             Mar tmp2 = x ^ (n/2);  
  70.             return tmp + tmp * tmp2;  
  71.         }  
  72.     }  
  73. }  
  74. int main()  
  75. {  
  76.     while(~scanf("%d%d%d",&n,&k,&m))  
  77.     {  
  78.         int i,j;  
  79.         for(i=0;i<n;i++)  
  80.         for(j=0;j<n;j++){  
  81.             scanf("%d",&x.map[i][j]);  
  82.             x.map[i][j]%=m;  
  83.         }  
  84.         Mar y = sum(k);  
  85.         for(i=0;i<n;i++)  
  86.         for(j=0;j<n;j++){  
  87.             printf("%d%c",y.map[i][j],j==n-1?'\n':' ');  
  88.         }  
  89.         break;  
  90.     }  
  91.     return 0;  

基于c语言实现的矩阵乘法

  • 2016年03月30日 10:21
  • 2.43MB
  • 下载

矩阵乘法.c

  • 2015年01月13日 15:05
  • 1KB
  • 下载

十个利用矩阵乘法解决的经典题目

十个利用矩阵乘法解决的经典题目     好像目前还没有这方面题目的总结。这几天连续看到四个问这类题目的人,今天在这里简单写一下。这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质。     ...

n维矩阵乘法

  • 2012年12月11日 19:02
  • 220KB
  • 下载

基于C语言的矩阵乘法

  • 2015年07月27日 14:08
  • 2KB
  • 下载

Codevs 1305 Freda的道路(矩阵乘法 DP优化)

1305 Freda的道路 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description Freda要到...

linux多线程实现矩阵乘法

  • 2011年11月08日 17:08
  • 2KB
  • 下载

[bzoj 4540] [Hnoi2016]序列:离线,线段树,矩阵乘法

题意:给一个长为N的序列,每项绝对值不超过10^9。Q个询问,求某区间的所有子区间的最小值之和。(1 ≤N,Q ≤ 100000) UPDATE 2017.5.27: 这类离线线段树问题更好的理解方式...

矩阵乘法运算

  • 2012年04月10日 10:10
  • 498KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:矩阵乘法
举报原因:
原因补充:

(最多只允许输入30个字)