【发布时间】:2017-07-16 03:56:15
【问题描述】:
我正在尝试实现分而治之的矩阵乘法(8 递归版本不是 Strassen)。我以为我已经弄清楚了,但是它会产生奇怪的输出,其中包含太多嵌套列表和错误的值。我怀疑问题在于我如何对 8 个递归求和,但我不确定。
def multiMatrix(x,y):
n = len(x)
if n == 1:
return x[0][0] * y[0][0]
else:
a = [[col for col in row[:len(row)/2]] for row in x[:len(x)/2]]
b = [[col for col in row[len(row)/2:]] for row in x[:len(x)/2]]
c = [[col for col in row[:len(row)/2]] for row in x[len(x)/2:]]
d = [[col for col in row[len(row)/2:]] for row in x[len(x)/2:]]
e = [[col for col in row[:len(row)/2]] for row in y[:len(y)/2]]
f = [[col for col in row[len(row)/2:]] for row in y[:len(y)/2]]
g = [[col for col in row[:len(row)/2]] for row in y[len(y)/2:]]
h = [[col for col in row[len(row)/2:]] for row in y[len(y)/2:]]
ae = multiMatrix(a,e)
bg = multiMatrix(b,g)
af = multiMatrix(a,f)
bh = multiMatrix(b,h)
ce = multiMatrix(c,e)
dg = multiMatrix(d,g)
cf = multiMatrix(c,f)
dh = multiMatrix(d,h)
c = [[ae+bg,af+bh],[ce+dg,cf+dh]]
return c
a = [
[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16]
]
b = [
[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16]
]
print multiMatrix(a,b)
【问题讨论】:
-
x[0][0] * y[0][0]不是矩阵。 -
考虑 ae = bg = ... = [[1]]。然后 c = [[ [1] + [1], [1] + [1] ], [ [1] + [1], [1] + [1] ]] = [[ [1, 1], [ 1, 1] ], [ [1, 1], [1, 1] ]] -- 不是矩阵。
-
同样,
ae+bg不是矩阵加法,[[ae+bg,af+bh],[ce+dg,cf+dh]]也不是从块构建矩阵。
标签: python algorithm recursion matrix-multiplication divide-and-conquer