#include

#include

#include

#include

using namespace std;

int *InitMatrix(int row,int col);//初始化

void FillMatrix(int *MatrixA, int size);//自动填充

void PrintMatrix(int *MatrixA,int size);//打印矩阵

void AddMatrix(int *MatrixIn1,int *MatrixIn2,int *MatrixOut,int size);//加

void SubMatrix(int *MatrixIn1,int *MatrixIn2,int *MatrixOut,int size);//减

void SplitMatrix(int *MatrixIn,int *MatrixOut,int size,int part);//四分

void StitchMatrix(int *PartA,int *PartB,int *PartC,int *PartD,int *Result,int size);//反着拼回去

void Strassen(int *MA,int *MB,int *MC,int size); //Strassen算法

void GradeSchool(int *MatrixIn1,int *MatrixIn2,int *MatrixOut,int size);//对比算法

int main()

{

clock_t StartTimeS,EndTimeS,StartTimeG,EndTimeG;

int MaSize = 0;

cout << "Please input the row of matrix(it must be index of two,like,2,4,8):";

cin >> MaSize;

int *MA = NULL;//规避野指针

int *MB = NULL;

int *MC = NULL;

MA = InitMatrix(MaSize,MaSize);

MB = InitMatrix(MaSize,MaSize);

MC = InitMatrix(MaSize,MaSize);

FillMatrix(MA,MaSize);

FillMatrix(MB,MaSize);

cout << "Matrix A is:" << endl << endl;

PrintMatrix(MA,MaSize);

cout << "Matrix B is:" << endl << endl;

PrintMatrix(MB,MaSize);

cout << "Matrix A and B are generated!" << endl << "Start to caculate!" << endl;//提示填充完毕

StartTimeS = clock();

Strassen(MA,MB,MC,MaSize);

EndTimeS = clock();

cout << "After Strassen multiplication the result is:" << endl << endl;

PrintMatrix(MC,MaSize);

StartTimeG = clock();

GradeSchool(MA,MB,MC,MaSize);

EndTimeG = clock();

cout << "After Strassen multiplication the result is:" << endl << endl;

PrintMatrix(MC,MaSize);

cout << "Strassen method starts at:" << StartTimeS << endl << "ends at:" << EndTimeS << endl;

cout << "Grade-School method starts at:" << StartTimeG << endl << "ends at:" << EndTimeG << endl;

free(MA);//释放空间

free(MB);

free(MC);

return 0;

}

int *InitMatrix(int row,int col)//初始化矩阵,大小事先不确定,所以需要动态分配

{

int *p;

size_t size = sizeof(int)*row*col;//需要开row*col个int类型大小的空间

if (NULL == (p = (int *)malloc(size)))

{

cout << "Error in InitMatrix!" << endl;

return NULL;

}

else

return p; //返回矩阵首地址

}

void FillMatrix( int *MatrixA, int size)

{

for(int row = 0; row < size; row ++)

{

for(int col = 0; col < size; col ++)

{

MatrixA[row*size + col] = rand() %5;

}

}

}

void PrintMatrix(int *MatrixA,int size)

{

//cout<

for(int row = 0; row < size; row ++)

{

for(int col = 0; col < size; col ++)

{

cout << MatrixA[row*size + col] << "\t";

if ((col + 1) % ((size)) == 0)

cout << endl;

}

}

cout << endl;

}

void AddMatrix(int *MatrixIn1,int *MatrixIn2,int *MatrixOut,int size)

{

for(int i = 0;i < size*size;i ++)

{

MatrixOut[i] = MatrixIn1[i] + MatrixIn2[i];

}

}

void SubMatrix(int *MatrixIn1,int *MatrixIn2,int *MatrixOut,int size)

{

for(int i = 0;i < size*size;i ++)

{

MatrixOut[i] = MatrixIn1[i] - MatrixIn2[i];

}

}

void SplitMatrix(int *MatrixIn,int *MatrixOut,int size,int part)

{

int n = size/2;//编写方便

switch(part)

{

case 1://四分左上

{

for (int i = 0;i < n;i ++)

{

for (int j = 0;j < n;j ++)

{

MatrixOut[i*n + j] = MatrixIn[i*n + j];

}

}

break;

}

case 2://四分右上

{

for (int i = 0;i < n;i ++)

{

for (int j = 0;j < n;j ++)

{

MatrixOut[i*n + j] = MatrixIn[i*n + j + n];

}

}

break;

}

case 3://四分左下

{

for (int i = 0; i < n; i ++)

{

for (int j = 0; j < n; j ++)

{

MatrixOut[i*n + j] = MatrixIn[(i + n)*n + j];

}

}

break;

}

case 4://四分右下

{

for (int i = 0; i < n; i ++)

{

for (int j = 0; j< n; j ++)

{

MatrixOut[i*n + j] = MatrixIn[(i + n)*n + j + n];

}

}

break;

}

default :

cout<

}

}

void StitchMatrix(int *PartA,int *PartB,int *PartC,int *PartD,int *Result,int size)//反着拼回去

{

for(int i = 0; i < size; i ++)

{

for(int j = 0; j < size; j ++)

{

Result[i*size*2 + j] = PartA[i*size + j];

Result[i*size*2 + j + size] = PartB[i*size + j];

Result[(i + size)*size*2 + j] = PartC[i*size + j];

Result[(i + size)*size*2 + j + size] = PartD[i*size + j];

}

}

}

/*

/Strassen算法:

/分块,分到2*2

*/

void Strassen(int *MA,int *MB,int *MC,int size)

{

int n = size/2;

if (2 == size)//这样就不用分了,以及分到最后执行这个不用再递归

{

int p1,p2,p3,p4,p5,p6,p7;

p1 = MA[0]*(MB[1]-MB[3]) ;

p2 = (MA[0] + MA[1])*MB[3] ;

p3 = (MA[2] + MA[3])*MB[0] ;

p4 = MA[3]*(MB[2] - MB[0]) ;

p5 = (MA[0] + MA[3])*(MB[0] + MB[3]) ;

p6 = (MA[1] - MA[3])*(MB[2] + MB[3]) ;

p7 = (MA[0] - MA[2])*(MB[0] + MB[1]) ;

MC[0] = p5 + p4 - p2 + p6 ;

MC[1] = p1 + p2 ;

MC[2] = p3 + p4 ;

MC[3] = p5 + p1 -p3 - p7 ;

return ;

}

else

{

int *MA1 = NULL,*MA2 = NULL,*MA3 = NULL,*MA4 = NULL;

int *MB1 = NULL,*MB2 = NULL,*MB3 = NULL,*MB4 = NULL;

int *MC1 = NULL,*MC2 = NULL,*MC3 = NULL,*MC4 = NULL;

int *p1 = NULL,*p2 = NULL,*p3 = NULL,*p4 = NULL,*p5 = NULL,*p6 = NULL,*p7 = NULL;

int *TEMP1 = NULL,*TEMP2 = NULL;

MA1 = InitMatrix(n,n);

MA2 = InitMatrix(n,n);

MA3 = InitMatrix(n,n);

MA4 = InitMatrix(n,n);

MB1 = InitMatrix(n,n);

MB2 = InitMatrix(n,n);

MB3 = InitMatrix(n,n);

MB4 = InitMatrix(n,n);

MC1 = InitMatrix(n,n);

MC2 = InitMatrix(n,n);

MC3 = InitMatrix(n,n);

MC4 = InitMatrix(n,n);

p1 = InitMatrix(n,n);

p2 = InitMatrix(n,n);

p3 = InitMatrix(n,n);

p4 = InitMatrix(n,n);

p5 = InitMatrix(n,n);

p6 = InitMatrix(n,n);

p7 = InitMatrix(n,n);

TEMP1 = InitMatrix(n,n);

TEMP2 = InitMatrix(n,n);

SplitMatrix(MA,MA1,size,1);SplitMatrix(MA,MA2,size,2);SplitMatrix(MA,MA3,size,3);SplitMatrix(MA,MA4,size,4);

SplitMatrix(MB,MB1,size,1);SplitMatrix(MB,MB2,size,2);SplitMatrix(MB,MB3,size,3);SplitMatrix(MB,MB4,size,4);

/*///

/* p1=a(f-h)

/* p2=h(a+b)

/* p3=e(c+d)

/* p4=d(g+e)

/* p5=(e+h)(a+d)

/* p6=(g+h)(b-d)

/* p7=(a-c)(e+f)

/*A a1 b2 B e1 f2

/* c3 d4 g3 h4

///*/

//p1

SubMatrix(MB2,MB4,TEMP1,n);

Strassen(MA1,TEMP1,p1,n);

//p2

AddMatrix(MA1,MA2,TEMP1,n);

Strassen(MB4,TEMP1,p2,n);

//P3

AddMatrix(MA3,MA4,TEMP1,n);

Strassen(MB1,TEMP1,p3,n);

//P4

AddMatrix(MB3,MB1,TEMP1,n);

Strassen(MA4,TEMP1,p4,n);

//P5

AddMatrix(MB1,MB4,TEMP1,n);

AddMatrix(MA1,MA4,TEMP2,n);

Strassen(TEMP1,TEMP2,p5,n);

//P6

AddMatrix(MB3,MB4,TEMP1,n);

SubMatrix(MA2,MA4,TEMP1,n);

Strassen(TEMP1,TEMP2,p6,n);

//P7

AddMatrix(MB1,MB2,TEMP1,n);

SubMatrix(MA1,MA3,TEMP2,n);

Strassen(TEMP1,TEMP2,p7,n);

//C1=P5+P4+P6-P2

AddMatrix(p5,p4,TEMP1,n);

AddMatrix(TEMP1,p6,TEMP2,n);

SubMatrix(TEMP2,p2,MC1,n);

//C2=P1+P2

AddMatrix(p1,p2,MC2,n);

//C3=P3+P4

AddMatrix(p3,p4,MC3,n);

//C4=P5+P1-P3-P7

AddMatrix(p5,p1,TEMP1,n);

SubMatrix(TEMP1,p3,TEMP2,n);

SubMatrix(TEMP2,p7,MC4,n);

StitchMatrix(MC1,MC2,MC3,MC4,MC,n);

free(MA1);free(MA2);free(MA3);free(MA4);

free(MB1);free(MB2);free(MB3);free(MB4);

free(MC1);free(MC2);free(MC3);free(MC4);

free(p1);free(p2);free(p3);free(p4);free(p5);free(p6);free(p7);

free(TEMP1);free(TEMP2);

return ;

}

}

void GradeSchool(int *MatrixIn1,int *MatrixIn2,int *MatrixOut,int size)

{

for (int i = 0; i < size; i ++)

{

for (int j = 0; j < size; j ++)

{

MatrixOut[i*size + j] = 0;

for (int k = 0; k < size; k ++)

{

MatrixOut[i*size + j] = MatrixOut[i*size + j] + MatrixIn1[i*size + k]*MatrixIn2[k*size + j];

}

}

}

}

python矩阵乘法分治_分治法实现矩阵乘法相关推荐

  1. 分治法解决矩阵乘法问题

    分治法解决矩阵乘法问题 传统for循环: #include<iostream> #include<cstdio> #include <vector> #includ ...

  2. python矩阵乘法分治算法_矩阵乘法的Strassen算法详解 --(算法导论分治法求矩阵)...

    1 题目描述 2 思路分析 3 解法 4 小结 1 题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 2 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数 ...

  3. python分治算法_分治法及其python实现例子

    在前面的排序算法学习中,归并排序和快速排序就是用的分治法,分治法作为三大算法之一的,有非常多的应用例子. 分治法概念 将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题-- ...

  4. 大整数乘法(递归+分治法)

    目录 一.问题描述 二.思路分析 分治法介绍: 问题分析: 三.算法伪代码 四.代码实现效果 五.源代码 六.参考文章 一.问题描述 请设计一个有效的算法,可以进行两个n位大整数的乘法.(n=2^k, ...

  5. java最接近对点及距离_最接近点对问题_分治法

    一.问题描述 给定平面上的n个点,找其中的一对点,使得在n个点组成的所有点对中该点对间的距离最小. 二.解题思路及所选算法策略的可行性分析 思路:利用分治法来解决问题.递归子结构求最接近点对总体可分为 ...

  6. c语言分治法求众数重数_分治法求众数 - osc_twlari2q的个人空间 - OSCHINA - 中文开源技术交流社区...

    分治法求众数 Problem Description 给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数.多重集S中重数最大的元素称为 众数.例如,S={1,2,2,2,3,5}. ...

  7. (分治)分治法 及 题目

    分治法思想 将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解. 分治模式在每层递归时都有三个步骤: 分解原问题为若干子问题,这些子问题是 ...

  8. c语言分治法求众数重数_分治法实现众数问题--例如:S={1,2,2,2,3,5},则多重集S的众数是2,其重数为3。对于给定的由m个自然数组成的多重集S,计算出S的众数及其重数。...

    题目的描述: 例如:S={1,2,2,2,3,5},则多重集S的众数是2,其重数为3. 对于给定的由m个自然数组成的多重集S,计算出S的众数及其重数. 众数------一组元素中出现的次数是最多的 重 ...

  9. python矩阵和向量乘积_向量点积和矩阵乘积的区别

    点积 dot product 点积是针对向量而言的. 我们可以理解为维度[n,1]或者[1,n],一维的矩阵. 在python中,我们设置一个array,查看其shape: >>> ...

最新文章

  1. python ffmpeg pipe_ffmpeg-python通过pipe与librosa进行数据流交互
  2. Oracle数据库中的优化方案
  3. 一些VC++ 系统类通用类
  4. mysql mongodb 集群_MySQL与MongoDB
  5. uniGUI 实操感受
  6. C语言常用字符串操作函数大全详解(strstr,strtok,strrchr,strcat,strcmp,strcpy,strerror,strspn,strchr等)
  7. 抓取html中用到的css_如何使用HTML和CSS制作像《星球大战》一样的抓取文字
  8. 【registry】registry合并带spring boot项目第一弹
  9. Linux(Ubuntu)如何安装常用软件(chrome、输入法、远程桌面)
  10. MySQL中的substr()函数
  11. c#通过OleDb连接sybase 15.5
  12. Linux操作系统中使用“autogen.sh+configure+make”编译代码的方法
  13. 利用python爬虫技术模拟提交问卷星/问卷网表单
  14. 汉语言01C1501,2019年北京自考汉语言文学(本科)专业(01C1501)要考哪些科目?...
  15. DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unico
  16. 2022年的国外广告联盟,合格的EMU者有你吗?
  17. .max文件导入Unity出现异常
  18. DOS命令--ASSOC的学习
  19. 花儿虽然最终凋零,但是依然开过 ——《花束般的恋爱》影评
  20. Android:rxjava简单实现原理(map/flatmap操作符)

热门文章

  1. 小团队项目管理开源工具_超越指标:如何在当今的开源项目中以团队方式运作
  2. android开源2016_2016年开源年鉴:现在提供印刷版
  3. es6 Class 的 getter函数和setter函数
  4. apt-get install 时无法获得锁 /var/lib/dpkg/lock - open
  5. linux top 中的内存 与 free,linux top命令下内存资源的讨论,高手请进。。。
  6. java兵乓球队问题_Java两个乒乓球队比赛名单问题(判断素数)
  7. java怎么连elk_从Java应用程序登录到ELK而无需解析日志
  8. kafka python_kafka python
  9. spark 源码分析之十九 -- DAG的生成和Stage的划分
  10. [转]Postgres-XL 10r1英文文档