4.2.1 矩阵乘法的暴力解法
#暴力解法
def matrix_multiply(a,b):
n=len(a)
c=[[0]*n for i in range(n)]#快速创建n阶初始化方阵
for i in range (0,n):
for j in range(0,n):
c[i][j]=0
for k in range(0,n):
c[i][j]+=a[i][k]*b[k][j]
return c
这里假定a和b都是方阵,如果选择暴力解法,三个for循环,循环次数为n,总共需要花费θ(n^3)时间。
4.2.2 矩阵乘法的简单分治法
算法策略:(前提:假定A,B都是n等于2的次幂的方阵)
(1)基本思路:计算C=A*B时,将C,A,B矩阵进行分块操作,对每个分块的矩阵进行乘法运算,运算完毕后重新对得到的C11,C12,C21,C22进行组合操作。
(2)确定递归终止条件:当分块矩阵得到的阶数为1 时,得到的C即是A和B中两个元素的乘积。
def division(a): #矩阵分块函数
n=len(a)//2
a11=[[0 for i in range(n)]for j in range(n)]
a12=[[0 for i in range(n)]for j in range(n)]
a21=[[0 for i in range(n)]for j in range(n)]
a22=[[0 for i in range(n)]for j in range(n)]
for i in range(n):
for j in range(n):
a11[i][j]=a[i][j]
a12[i][j]=a[i][j+n]
a21[i][j]=a[i+n][j]
a22[i][j]=a[i+n][j+n]
return (a11,a12,a21,a22)
def matrix_combination(a11,a12,a21,a22):
n2 = len(a11)
n=n2*2
a = [[0 for col in range(n)] for row in range(n)]
for i in range (0,n):
for j in range (0,n):
if i <= (n2-1) and j <= (n2-1):
a[i][j] = a11[i][j]
elif i <= (n2-1) and j > (n2-1):
a[i][j] = a12[i][j-2]
elif i > (n2-1) and j <= (n2-1):
a[i][j] = a21[i-n2][j]
else:
a[i][j] = a22[i-n2][j-n2]
return a
def matrix_add(a,b): #矩阵相加函数
n = len(a)
c = [[0 for col in range(n)] for row in range(n)]
for i in range(0,n):
for j in range(0,n):
c[i][j] = a[i][j]+b[i][j]
re