矩阵求幂变得太慢

时间:2020-09-09 07:19:10

标签: python matrix-multiplication multiplication

我目前正在尝试计算矩阵求幂,为此,我使用了众所周知的平方求幂算法。

def mat_mul(a, b):
    n = len(a)
    c = []
    for i in range(n):
        c.append([0]*n)
        for j in range(n):
            for k in range(n) :                    
                c[i][j] += (a[i][k]*b[k][j])
    return c

def mat_pow(a, n):
    if n<=0:
        return None
    if n==1:
        return a
    if n==2:
        return mat_mul(a, a)
    t1 = mat_pow(a, n//2)
    if n%2 == 0:
        return mat_mul(t1, t1)
    return mat_mul(t1, mat_mul(a, t1))

问题是我的算法仍然太慢,经过一些研究,我发现这是因为与我的想法相反,矩阵乘法的时间取决于矩阵大小在矩阵中的数字上。

实际上,矩阵中的数字变得非常大,因此一段时间后,乘法的速度变慢了。通常,我有M,一个13 * 13矩阵,其中填充有随机数1和0,并且我想计算M (10 8 。矩阵中的整数可以具有数百个数字。 我想知道是否有办法避免这个问题。

我已经看到我可以使用矩阵对角线化,但是问题是我不能使用外部库(例如numpy)。所以对角化算法似乎太复杂了。

1 个答案:

答案 0 :(得分:3)

矩阵乘法的时间取决于矩阵的大小和矩阵中的数字。

当然,您正在乘以任意大小的整数。 CPU不支持这些乘法,因此它将非常慢,并且随着整数的增长而变得越来越慢。

矩阵中的整数可以具有数百个数字。我想知道是否有办法避免这个问题。

有几种方法:

  • 避免整数,使用浮点数并处理错误,但是项目需要这样做。这将大大提高速度,最重要的是,它不再取决于数字的大小。内存使用量也将大大减少。

  • 使用更好的算法。您已经建议过这种方法,但是如果更好的算法为您提供更好的边界,这就是提高性能的最佳方法之一。

  • 使用低级系统语言对其进行优化。这可以使您获得一些性能,大约一个数量级。对于高性能计算,Python是非常的错误选择,除非您使用像numpy这样专门为您工作的库。

理想情况下,如果您确实需要演奏,则应该执行 all 3。