问题
用Strassen算法计算两个n阶矩阵相乘C=A×B。
行列式
n阶行列式(Determinant):
a11a21⋮an1a12a22⋮an2⋯⋯⋯a1na2n⋮ann 表示n个元素的乘积
a1j1a2j2⋯anjn 的代数和。其中j1,j2,…,jn是1,2,…,n的一个排列。当j1,j2,…,jn是奇排列时该项带负号,当j1,j2,…,jn是偶排列时该项带正号。对于元素ajpjq下标的两个数字,若1≤p<q≤n且jp>jq则称这两个有序的数[jp,jq]是逆序对。逆序对的数量称为逆序对数。若a1j1a2j2⋯anjn中所有元素下标的逆序对数为偶数,则称排列j1,j2,…,jn为偶排列;否则为奇排列。
即
a11a21⋮an1a12a22⋮an2⋯⋯⋯a1na2n⋮ann=j1j2⋯jn∑(−1)τ(j1j2⋯jn)a1j1a2j2⋯anjn 其中τ(j1j2⋯jn)是行列式的逆序数,∑j1j2⋯jn表示对所有n阶排列求和,该式称为n阶行列式的完全展开式。
特别的2阶行列式和3阶行列式的完全展开式分别为
acbd=a⋅d−b⋅c a11a21a31a12a22a32a13a23a33=a11a22a33+a12a23a31+a13a21a32−a13a22a31−a12a21a33−a11a23a32 行列式操作和特性:
(1) 经过转置行列式的值不变,即AT=A。行列式的转置是将A的行和列交换,得到AT,转置行列式的任意元素满足aijt=aji;例如
A33=a11a21a31a12a22a32a13a23a33A33T=a11a12a13a21a22a23a31a32a33 (2) 行列式中的任意两行/列交换位置,行列式的值不变;例如
a11a21a31a12a22a32a13a23a33=a21a11a31a22a12a32a23a13a33=a22a12a32a21a11a31a23a13a33 特别的,当两行/列相同时,该行列式的值为0;
(3) 某行/列中所有元素若存在公因子k,则可以将k提到行列式外;例如
k⋅a11a21⋮an1k⋅a12a22⋮an2⋯⋯⋯k⋅a1na2n⋮ann=k⋅a11a21⋮an1a12a22⋮an2⋯⋯⋯a1na2n⋮ann 特别的,某行/列的值全为0,该行列式的值为0;某两行/列的元素对应成比例,行列式的值为0;
(4) 某行/列的每个元素是两个元素之和,则可以把行列式拆分为两个行列式之和;例如
a1+b1c1d1a2+b2c2d2a3+b3c3d33=a1c1d1a2c2d2a3c3d33+b1c1d1b2c2d2b3c3d33 (5) 把某行/列的k倍加到另一行/列上,行列式的值不变;例如
a1b1c1a2b2c2a3b3c33=a1b1+k⋅a1c1a2b2+k⋅a2c2a3b3+k⋅a3c33 矩阵
矩阵(Matrix):n×m个数字组成的n行m列的表格Anm
Anm=a11a21⋮an1a12a22⋮an2⋯⋯⋱⋯a1ma2m⋮anm 其中第i行第j列的元素为aij(1≤i≤n,1≤j≤m)。特别的当n=m时称矩阵A为n阶矩阵或n阶方阵。
矩阵操作和特性:
(1) 零矩阵:所有元素都为0的矩阵
00⋮000⋮0⋯⋯⋱⋯00⋮0 零矩阵记为O。
(2) 若两矩阵Anm和Bst的行和列数量相等,即n=s,m=t,称。的两矩阵称为同型矩阵。若同型矩阵的所有对应元素也想等,则两矩阵相等。
(3) n阶方阵A构成的行列式称为A的行列式,记作A。注意矩阵是一个表格,而行列式经过计算后是一个值。
(4) 矩阵加法:两个同型矩阵可以相加,即Cnm=Anm+Bnm,任意元素满足cij=aij+bij(1≤i≤n,1≤j≤m)。矩阵加法满足特性
A+B=B+A(A+B)+C=A+(B+C)A+O=A,A−O=A (5) 矩阵数乘:矩阵与数可以相乘,即Bnm=k⋅Anm,任意元素满足bij=k⋅aij(1≤i≤n,1≤j≤m)。矩阵数乘满足特性
k(mA)=(km)A=m(kA)(k+m)A=kA+mAk(A+B)=kA+kB1⋅A=A0⋅A=O (6) 矩阵乘法:两个矩阵Anm,Bst相乘必须满足条件m=s,即Cnt=Anm×Bst(m=s),任意元素满足cij=∑k=1maik⋅bkj(1≤i≤n,1≤j≤t,1≤k≤m)。特别的,若A是n阶方阵,则k个矩阵A相乘的结果记为∏i=1kA=Ak,称为A的k次幂。矩阵乘法满足特性
(AB)C=A(BC)A(B+C)=AB+AC(B+C)A=BA+CA 注意一般情况下AB=BA。
(7) 矩阵转置:将矩阵Anm的行和列交换得到矩阵AmnT,任意元素满足aijt=aji。称AmnT为A的转置矩阵。矩阵转置满足特性
(A+B)T=AT+BT(k⋅A)T=k⋅AT(A⋅B)T=BT⋅AT(AT)T=A (8) 单位矩阵:n阶矩阵中,主对角线上的元素都是1,其余元素都是0,称为n阶单位矩阵,简写作E,En或I。即aii=1,aij=0(其中i=j)。
Ann=111021⋮0n1012122⋮0n2⋯⋯⋱⋯01n02n⋮1nn (9) 数量矩阵:数字k与单位矩阵E的积k⋅E称为数量矩阵。
(10) n阶矩阵的主对角线:即矩阵Ann上的所有元素aii(其中1≤i≤n)。所有元素aii连起来称为矩阵的对角线,其中的元素称为对角元素。
(11) 对角矩阵:非对角元素全为0的n阶方阵称为对角矩阵。
(12) 上/下三角矩阵:主对角线以下/上(不包括主对角线)元素都为0的n阶矩阵,即aij=0,i>j(上三角矩阵),aij=0,i<j(下三角矩阵)。
(13) 对称矩阵/反对称矩阵:满足AT=A(即aijt=aji)的矩阵为对称矩阵,满足AT=−A(即aijt=−aji)的矩阵称为反对称矩阵。
Strassen算法
根据数学定义,计算两个n阶矩阵相乘,由于cij=∑k=1naik⋅bkj,计算C中的一个元素的时间复杂度为O(n)。C中有n2个元素,因此时间复杂度为O(n3)。Strassen算法的时间复杂度比平凡算法更低。
对于n阶矩阵乘法C=A×B,设n为偶数,则可以将A,B,C三个矩阵划分为4个n/2的矩阵,C=A×B转化为
[rtsu]=[acbd]×[egfh] 按照矩阵乘法计算方法可知
r=a×e+b×gs=a×f+b×ht=c×e+d×gu=c×f+d×h 上面计算中设两个n阶矩阵相乘的时间复杂度为T(n),则8次矩阵相乘的时间复杂度为8⋅T(2n)。n阶方阵的加法需要分别计算n2次两个元素之和,因此时间复杂度为O(n2)。由此可知
T(n)=8⋅T(2n)+O(n2) 通过时间复杂度的推导方法,可以得出T(n)=O(n3)。因此分治法的时间复杂度与平凡算法相同。
Strassen算法在分治法基础上设置7个中间矩阵,将上式转化为
p1=a×f−a×h=a×(f−h)p2=a×h+b×h=(a+b)×hp3=c×e+d×e=(c+d)×ep4=d×g−d×e=d×(g−e)p5=a×e+a×h+d×e+d×h=(a+d)×(e+h)p6=b×g+b×h−d×g−d×h=(b−d)×(g+h)p7=a×e+a×f−c×e−c×f=(a−c)×(e+f) 可得
r=p5+p4−p2+p6s=p1+p2t=p3+p4u=p1+p5−p3−p7 这样计算矩阵相乘时,只需要计算7次矩阵相乘运算,矩阵间的加减运算的时间复杂度仍然是O(n2)。即有
T(n)=7⋅T(2n)+O(n2) 最终推导可得,Strassen算法的时间复杂度为O(nlog27)≈O(n2.81)。
数学复习全书(2013年李永乐李正元考研数学 数学一) - 第二篇 线性代数
源码
Strassen.h
Strassen.cpp
测试
StrassenTest.cpp