我目前正在尝试计算矩阵求幂,为此,我使用了众所周知的平方求幂算法。
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)。所以对角化算法似乎太复杂了。
答案 0 :(得分:3)
矩阵乘法的时间取决于矩阵的大小和矩阵中的数字。
当然,您正在乘以任意大小的整数。 CPU不支持这些乘法,因此它将非常慢,并且随着整数的增长而变得越来越慢。
矩阵中的整数可以具有数百个数字。我想知道是否有办法避免这个问题。
有几种方法:
避免整数,使用浮点数并处理错误,但是项目需要这样做。这将大大提高速度,最重要的是,它不再取决于数字的大小。内存使用量也将大大减少。
使用更好的算法。您已经建议过这种方法,但是如果更好的算法为您提供更好的边界,这就是提高性能的最佳方法之一。
使用低级系统语言对其进行优化。这可以使您获得一些性能,大约一个数量级。对于高性能计算,Python是非常的错误选择,除非您使用像numpy这样专门为您工作的库。
理想情况下,如果您确实需要演奏,则应该执行 all 3。