算法导论 4.2-2

本文介绍了Strassen算法在矩阵乘法中的应用,通过减少矩阵乘法次数达到加速计算的目的。核心思想是将矩阵拆分,递归进行7次而非8次矩阵乘法,时间复杂度为O(n^lg7)。文章提供了算法的伪代码和Python实现。
摘要由CSDN通过智能技术生成

算法导论 4.2-2 使用Strassen方法便捷计算矩阵(pyhton code)

归并思路

Strassen算法的核心思想是令递归树稍微不那么茂盛一点儿, 即只递归进行7次而不是8次矩阵的乘法。减少一次矩阵乘法带来的代价可能是额外几次矩阵加法,但只是常数次,因此比O(n³)花费时间少,是O(n^lg7),这是算法最出色的部分。

伪代码部分
STRASSEN(A, B)
n = A.rows
if n == 1
return a[1, 1] * b[1, 1]
let C be a new n × n matrix
A[1, 1] = A[1…n / 2][1…n / 2]
A[1, 2] = A[1…n / 2][n / 2 + 1…n]
A[2, 1] = A[n / 2 + 1…n][1…n / 2]
A[2, 2] = A[n / 2 + 1…n][n / 2 + 1…n]
B[1, 1] = B[1…n / 2][1…n / 2]
B[1, 2] = B[1…n / 2][n / 2 + 1…n]
B[2, 1] = B[n / 2 + 1…n][1…n / 2]
B[2, 2] = B[n / 2 + 1…n][n / 2 + 1…n]
S[1] = B[1, 2] - B[2, 2]
S[2] = A[1, 1] + A[1, 2]
S[3] = A[1, 2] + A[2, 2]
S[4] = B[2, 1] - B[1, 1]
S[5] = A[1, 1] + A[2, 2]
S[6] = B[1, 1] + B[2, 2]
S[7] = A[1, 2] - A[2, 2]
S[8] = B[2, 1] + B[2, 2]
S[9] = A[1, 1] - A[2, 1]
S[10] = B[1, 1] + B[1, 2]
P[1] = STRASSEN(A[1, 1], S[1])
P[2] = STRASSEN(S[2], B[2, 2])
P[3] = STRASSEN(S[3], B[1, 1])
P[4] = STRASSEN(A[2, 2], S[4])
P[5] = STRASSEN(S[5], S[6])
P[6] = STRASSEN(S[7], S[8])
P[7] = STRASSEN(S[9], S[10])
C[1…n / 2][1…n / 2] = P[5] + P[4] - P[2] + P[6]
C[1…n / 2][n / 2 + 1…n] = P[1] + P[2]
C[n / 2 + 1…n][1…n / 2] = P[3] + P[4]
C[n / 2 + 1…n][n / 2 + 1…n] = P[5] + P[1] - P[3] - P[7]
return C

Code Python

# 


def STRASSEN(A,B):
    if A.shape[0]==1 and B.shape[0]==1 and A.shape[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值