矩阵乘法-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),但是人们还不知道矩阵乘法
的复杂度下限是多少。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值