矩阵乘法-Strassen矩阵乘法

          一个n-by-n矩阵是n行n列的数排列起来的方阵。矩阵A第i行第j列数记为aij。定义两个n阶矩阵的乘法C = A * B,其中cij = ai1b1j + ai2b2j + ... + ainbnj

          基本的矩阵乘法是O(n3)的,程序如下:

          void matmult ( matrix a , matrix b , matrix & c)
          {
          	c.m = a.m; c.n = b.n
          	for(int i = 1; i <= a.m; i ++)
          	for(int j = 1; j <= b.n; j ++)
          	{
          		c. num [i][j ] = 0;
          		for( int k = 1; k <= a.n; k ++)
          			c. num[i][j ] += a.num [i][k ] * b.num [k][j];
          	}
          }
          考虑基本分治算法。把矩阵分两四个子矩阵。


          则r = ae + bg, s = af + bh, t = ce + dh, u = cf + dg,一共需要8次乘法和4次加法。因为每次加法需要O(n^2)的时间,因此递归方程为T(n)=8T(n/2)+ O(n^2),解为O(n3),和暴力乘法一样。

          Strassen的改进方法和Karatsuba快速乘法类似。记P1 = a(f - h), P2=(a + b)h, P3=(c + d)e, P4 = d(g - e), P5=(a + d)(e + h), P6=(b - d)(g + h), P7=(a - c)(e + f),则:r = P5 +P4-P2 +P6, s = P1 +P2, t = P3 +P4, u = P5 +P1 -P3 -P7。一共7次乘法,18次加减法,而且并没有使用过乘法交换律(矩阵乘法不满足交换律)!

          这样,方程变为T(n) = 7T(n/2) + O(n2),它的解为O(nlog 7)=O(n^2.81),比暴力乘法略好。目前最好的矩阵乘法算法时间复杂度为O(n^2.376),但是人们还不知道矩阵乘法 的复杂度下限是多少。

          相关文章
          相关标签/搜索
          每日一句
            每一个你不满意的现在,都有一个你没有努力的曾经。
          公众号推荐
             一个历史类的公众号,欢迎关注
          一两拨千金
          三十码期期必中√资料今晚六给彩开奖结果,白小姐中特玄机,六开彩开奖现场直播,2017开奖记录开奖结果,开马现场直播,马报免费资料2017大全