算法导论 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[