矩阵乘法(分治法).docxVIP

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
矩阵乘法(分治法)

算法设计与分析实验报告实验名称: 矩阵乘法(分冶法) 一、问题陈述和分析:1.实验目的:掌握分总冶策略的基本思想以及用分冶法解决问题的一般技巧.运用编程工具,并运用分冶法来解决矩阵乘法问题;2.实验内容:设A 和 B 是两个n * n阶矩阵,求它们两的乘积矩阵C。这里,假设n是2的幂次方; 3.实验要求:编制程序并对其时间复杂度和空间复杂度进行分析.二、模型拟制、算法设计和正确性证明:设A和B是两个n*n阶矩阵,求他们两的成绩矩阵C。这里假设n是2的幂次方;A和B是两个n*n的矩阵,他们的乘积C=AB也是一个n*n的矩阵,矩阵C中的元素C[i][j]定义为C[i][j]= ,则每计算一个C[i][j],需要做n次乘法和n-1次加法。因此计算C的n2个元素需要n3次乘法和n3- n2次加法。因此,所需的时间复杂度是O(n3)。 但是使用分治法可以改进算法的时间复杂度。这里,假设n是2的幂。将矩阵A,B,C中每一矩阵都分成4个大小相等的子矩阵,每个子矩阵是(n/2)*(n/2)的方阵。由此,可将方阵C=AB重写为 因此可得: C11=A11B11+A12B21 C12=A11B12+A12B22 C21=A21B11+A22B22 C22=A21B12+A22B22 这样就将2个n阶矩阵的乘积变成计算8个n/2阶矩阵的乘积和4个n/2阶矩阵的加法。当n=1时,2个1阶方阵的乘积可直接算出,只需要做一次乘法。当子矩阵阶n1时,为求两个子矩阵的乘积,可继续对两个子矩阵分块,直到子矩阵的阶为1。由此,便产生了分治降阶的递归算法。但是这个算法并没有降低算法的时间复杂度。由strassen矩阵乘法,M1=A11(B12-B22)M2=(A11+A12)B22M3=(A21+A22)B11M4=A22(B21-B11)M5=(A11+A22)(B11+B22)M6=(A12-A22)(B21+B22)M7=(A11-A21)(B11+B12)C11=M5+M4-M2+M6C12=M1+M2C21=M3+M4C22=M5+M1-M3-M7算法共进行7次举证乘法,算法效率得到降低主要数据的定义: int n;n是方阵A,B,C的阶 int **A=new int*[n]; //矩阵A,B,C的定义,并为它们分配空间。这里A,B是用//于相乘的矩阵,C用于存放AB的结果 int **B=new int*[n]; int **C=new int*[n]; int i,j; for(i=0;in;i++) { A[i]=new int[n]; B[i]=new int[n]; C[i]=new int[n];}程序中定义的函数:1.void Divide(int n,int **A,int **A11,int **A12,int **A21,int **A22)函数实现的功能是:将n*n的矩阵A分块成四个大小相等的(n/2)*(n/2)的子矩阵A11,A12,A21,A22。2.void Unit(int n,int **A,int **A11,int **A12,int **A21,int **A22)函数实现的功能是:将四个(n/2)*(n/2)的矩阵A11,A12,A21,A22合并成一个n*n的矩阵A。4. void Add(int n,int **A,int **B,int **C) 函数的功能是:实现C=A+B,A,B,C都是n*n矩阵。3.void Mul(int n,int **A,int **B,int **M) 函数的功能是:将n*n的矩阵A,B相乘,结果存放在n*n的矩阵M中。算法设计:整个算法的大致思想是:在函数Mul(int n,int **A,int **B,int **M)中先判断n的值,若n==1,表示A,B,C均为一阶方阵。则M[0][0]=A[0][0]*B[0][0];否则,调用Divide(n,A,A11,A12,A21,A22);和Divide(n,B,B11,B12,B21,B22);将A和B都分为四个(n/2)*(n/2)的子矩阵。然后递归调用 Sub(n,B12,B22,T1);T1=B12-B22 Mul(n, A11,T1 ,M1);M1=A11(B12-B22) Add(n,A11,A12,T2); Mul(n,T2,B22,M2);M2=(A11+A12)B22 Add(n,A21,A22,T1); Mul(n,T1,B11,M3);M3=(A21+A22)B11 Sub(n,B21,B11,T1); Mul(n, A22,T1 ,M4);M4=A22(B21-B11) Add(n,A11,A22,T1); Add(n,B11,B22,T2); Mul(n,T1,T2,M5);M5=(A1

文档评论(0)

yan698698 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档