您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > Strassen算法-介绍
Strassen算法在了解Strassen算法之前,先来了解一下矩阵乘法:矩阵乘法的c语言程序:#includestdio.hfloatmain(){floata[100][100],b[100][100],c[100][100];//定义三个数组分别储存三个矩阵A,B,Cintm1,n1,m2,n2,i1,j1,i2,j2,i3,j3,i4,j4,k;floats[100][100]={0};//初始化数组sprintf(请输入矩阵A的行数m1和列数n1:);scanf(%d%d,&m1,&n1);printf(请输入矩阵B的行数m2和列数n2:);scanf(%d%d,&m2,&n2);printf(\n);//便于观看结果,将结果与输入分开if(n1!=m2)printf(不可以相乘!!!\n\n);if(m1100||n1100||m2100||n2100)printf(数目过多,溢出!!!\n\n);else{for(i2=1;i2=m2;i2++)for(j2=1;j2=n2;j2++){printf(A[%d][%d]=,i2,j2);scanf(%f,&a[i2][j2]);}//输入矩阵A的元素printf(\n);for(i2=1;i2=m2;i2++){for(j2=1;j2=n2;j2++){printf(B[%d][%d]=,i2,j2);scanf(%f,&b[i2][j2]);}//输入矩阵B的元素}}printf(矩阵A\n\n);//打印矩阵A便于观看与检查for(i3=1;i3=m1;i3++){for(j3=1;j3=n1;j3++){printf(%f\t,a[i3][j3]);if(j3==n1)printf(\n);}}printf(\n\n矩阵B:);//与矩阵B的打印隔开,便于观看for(i4=1;i4=m2;i4++){for(j4=1;j4=n2;j4++){printf(%f\t,b[i4][j4]);if(j4==n2)printf(\n);}}printf(\n\n矩阵C=A*B=\n);for(i4=1;i4=m1;i4++){for(j4=1;j4=n2;j4++){for(k=1;k=n1;k++){s[i4][j4]=s[i4][j4]+a[i4][k]*b[k][j4];}//定义矩阵的乘法,相乘时,有一个指标是一样的,都用kc[i4][j4]=s[i4][j4];}printf(矩阵C是:\n);for(i4=1;i4=m1;i4++){for(j4=1;j4=n2;j4++){printf(%f\t,c[i4][j4]);if(j4==n2)printf(\n);}}return0;}}设甲,乙两个方阵通过环ŕ。我们要计算的矩阵产品Ç如果2型Ñ×2矩阵甲,乙,ň我们填零丢失的行和列。我们分区甲,乙,Ç成大小相等的块矩阵【LetA,BbetwosquarematricesoveraringR.WewanttocalculatethematrixproductCasIfthematricesA,Barenotoftype2nx2nwefillthemissingrowsandcolumnswithzeros.WepartitionA,BandCintoequallysizedblockmatrices】Theleftcolumnrepresents2x2matrixmultiplication.Naïvematrixmultiplicationrequiresonemultiplicationforeach1oftheleftcolumn.Eachoftheothercolumnsrepresentsasingleoneofthe7multiplicationsinthealgorithm,andthesumofthecolumnsgivesthefullmatrixmultiplicationontheleft.【左边的列表示的2x2矩阵乘法。朴素的矩阵乘法,需要为每一个“1”的左边的列的一个乘法。7乘法算法的其他列中的每一个都代表一个单一的一个,并在左侧的列的总和给出了完整的矩阵乘法。】withThen采用这种结构,我们并没有减少乘法的次数。我们还需要8次乘法计算C[I,J]矩阵,我们需要的时候使用标准的矩阵乘法相同数量的乘法。现在来的重要组成部分。我们定义新的矩阵只使用7的乘法(每个Mk个之一)而不是8。现在我们就可以在MK表示C[i.j]是这样的[WemaynowexpresstheCi,jintermsofMk,likethis:]【Weiteratethisdivisionprocessntimes(recursively)untilthesubmatricesdegenerateintonumbers(elementsoftheringR).TheresultingproductwillbepaddedwithzeroesjustlikeAandB,andshouldbestrippedofthecorrespondingrowsandcolumns.PracticalimplementationsofStrassen'salgorithmswitchtostandardmethodsofmatrixmultiplicationforsmallenoughsubmatrices,forwhichthosealgorithmsaremoreefficient.TheparticularcrossoverpointforwhichStrassen'salgorithmismoreefficientdependsonthespecificimplementationandhardware.EarlierauthorshadestimatedthatStrassen'salgorithmisfasterformatriceswithwidthsfrom32to128foroptimizedimplementations.[1]However,ithasbeenobservedthatthiscrossoverpointhasbeenincreasinginrecentyears,anda2010studyfoundthatevenasinglestepofStrassen'salgorithmisoftennotbeneficialoncurrentarchitectures,comparedtoahighlyoptimizedtraditionalmultiplication,untilmatrixsizesexceed1000ormore,andevenformatrixsizesofseveralthousandthebenefitistypicallymarginalatbest(around10%orless).[2]】我们本的分裂过程Ň次(递归)重复,直到子矩阵退化成号(环ŕ的元素)。将所得的产物将被填充零就像甲和乙,并应被剥离的相应的行和列。实用的Strassen算法开关矩阵乘法的足够小的子矩阵的标准方法的实现,这些算法是更有效的。取决于具体的实现和硬件的特定的交叉点的Strassen算法是更有效的。此前笔者曾预计,Strassen重的算法是更快的矩阵与宽度从32到128优化的实现。[1]然而,它已被观察到,这个交叉点已被越来越多,近年来,和一个2010年的研究发现,即使一个单步骤的Strassen重的算法是不利于对当前的体系结构中,一个高度优化的传统乘法相比,直到矩阵大小超过1000个或更多,和甚至为矩阵大小几千的好处是通常边际充其量(约10%或更少的)[2]渐近复杂性(Asymptoticcomplexity)标准的矩阵乘法大约需要2ñ3(Ň=2Ň)算术运算(加法和乘法)的渐近复杂度为O(Ñ3)。Strassen算法所需的加法和乘法的数目可以计算如下:让f()的操作的数量为2Ñ×2n的矩阵。然后通过递归应用Strassen算法,我们看到,f(n)的=7f(Ñ-1)+14正,对于某个常数,在每个应用程序的算法进行的加法的数目取决于。因此,f(Ñ)=(7+O(1))Ñ,即乘以矩阵大小Ň=2n的Strassen算法的渐近复杂性然而,算术运算的数目的减少在一个有所减少的数值稳定性的价格,并且该算法也需要天真算法相比显着更多的内存。必须具有它们的尺寸扩展到在存储多达四次一样多的元素的下一个2的幂,从而导致这两个初始矩阵,和七个辅助矩阵的每一个包含在扩大的四分之一的元素【Thereductioninthenumberofarithmeticoperationshowevercomesatthepriceofasomewhatreducednumericalstability,andthealgorithmalsorequiressignificantlymorememorycomparedtothenaivealgorithm.Bothinitialmatricesmusthavetheirdimensionsexpandedtothenextpowerof2,whichresultsinstoringuptofourtimesasmanyelements,andthesevenauxiliarymatriceseachcontainaquarteroftheelementsintheexpandedones.】等级或双线性复杂的(Rankorbilinearcomplexity)【Thebilinearcomplexityorrankofabilinearmapisanimportantconceptintheasymptoticcomplexityofmatrixmultiplication.TherankofabilinearmapoverafieldFisdefinedas(somewhatofanabuseofnotation)】一个双线性映射的双线性的复杂性或职级的渐近复杂的矩阵乘法的一个重要概念。被定义为一个双线性映射的排名超过F(有点滥用的符号)【Inotherwords,therankofabilinearmapisthelengthofitsshortestbilinearcomputation.[3]TheexistenceofStrassen'salgorithmshowsthattherankof2×2matrixmultiplicationisnomorethanseven.Toseethis,letusexpressthisalgorithm(alongsidethestandardalgorithm)assuchabilinearcomputation.Inthecaseofmatrices,thedualspacesA*andB*consistofmapsintothefieldFinducedbyascalardouble-dotproduct,(i.e.inthiscasethesumofalltheentriesofaHadamardproduct.)】换句话说,一个双线性映射的排名是长度最短的双线性计算。[3]的Strassen算法的存在表明,2×2矩阵乘法的排名是不超过7。为了说明这一点,让我们表达这种算法的标准算法一起,这样的双线性计算。在矩阵的情况下,双空格甲*和乙*包括映射到由一个标量双点产品诱导的场F,(即在这种情况下的所有条目的Hadamard乘积的总和。)【Itcanbeshownthatthetotalnumberofelementarymult
本文标题:Strassen算法-介绍
链接地址:https://www.777doc.com/doc-1722251 .html