繁体   English   中英

矩阵求幂变得太慢

[英]Matrix exponentiation becomes too slow

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

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,一个用随机 1 和 0 填充的 13*13 矩阵,我想计算 M (10 8 ) 矩阵中的整数可以有数百位。 我想知道是否有办法避免这个问题。

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

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

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

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

有几种方式:

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

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

  • 用低级系统语言对其进行优化。 这可以让您恢复一些性能,大约一个数量级左右。 Python 是高性能计算的一个非常糟糕的选择,除非您使用像 numpy 这样的专门库来为您完成工作。

理想情况下,如果您确实需要性能,则应该执行所有3 项操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM