【问题标题】:Python: Divide and Conquer Recursive Matrix MultiplicationPython:分而治之的递归矩阵乘法
【发布时间】: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


【解决方案1】:

您的怀疑是正确的,您的矩阵仍然是列表,因此添加它们只会使列表更长。

尝试使用类似的东西

def matrix_add(a, b):
    return [[ea+eb for ea, eb in zip(*rowpair)] for rowpair in zip(a, b)]

在您的代码中。

加入区块:

def join_horiz(a, b):
    return [rowa + rowb for rowa, rowb in zip(a,b)]

def join_vert(a, b):
    return a+b

最后,为了让这一切协同工作,我认为您必须将您的特殊情况更改为 1 为

return [[x[0][0] * y[0][0]]]

编辑:

我刚刚意识到这仅适用于二维的幂。否则,您将不得不处理非方阵,并且x 会发生 1 x 某事,而您的特殊情况将不起作用。因此,您还必须检查 len(x[0])(如果 n > 0)。

【讨论】:

    猜你喜欢
    • 2020-04-11
    • 2012-03-04
    • 2017-12-05
    • 2014-02-25
    • 2011-06-18
    • 2016-11-17
    • 2019-03-13
    • 1970-01-01
    • 2020-09-21
    相关资源
    最近更新 更多