[英]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.