【发布时间】:2022-01-08 18:47:39
【问题描述】:
我试图在不使用 Numpy 的 3x3 矩阵(不使用任何库函数)的情况下计算 Matrix 的 n 次幂
这是我目前写的代码:
def matmul(M1, M2):
a1 = (M1[0][0]*M2[0][0]) + (M1[0][1] * M2[1][0]) + (M1[0][2] * M2[2][0])
a2 = (M1[0][0]*M2[0][1]) + (M1[0][1] * M2[1][1]) + (M1[0][2] * M2[2][1])
a3 = (M1[0][0]*M2[0][2]) + (M1[0][1] * M2[1][2]) + (M1[0][2] * M2[2][2])
a4 = (M1[1][0]*M2[0][0]) + (M1[1][1] * M2[1][0]) + (M1[1][2] * M2[2][0])
a5 = (M1[1][0]*M2[0][1]) + (M1[1][1] * M2[1][1]) + (M1[1][2] * M2[2][1])
a6 = (M1[1][0]*M2[0][2]) + (M1[1][1] * M2[1][2]) + (M1[1][2] * M2[2][2])
a7 = (M1[2][0]*M2[0][0]) + (M1[2][1] * M2[1][0]) + (M1[2][2] * M2[2][0])
a8 = (M1[2][0]*M2[0][1]) + (M1[2][1] * M2[1][1]) + (M1[2][2] * M2[2][1])
a9 = (M1[2][0]*M2[0][2]) + (M1[2][1] * M2[1][2]) + (M1[2][2] * M2[2][2])
return [[a1, a2, a3], [a4, a5, a6], [a7, a8, a9]]
def matpow(mat, p):
if p == 1:
return mat
m2 = matpow(mat, p//2)
if p%2 == 0:
return matmul(m2, m2)
else:
return matmul(matmul(m2, m2), mat)
这适用于较小数量的“n”,但在应用于较大数量时会失败并出现以下错误:
File "/workspace/default/solution.py", line 17, in matpow
m2 = matpow(mat, p//2)
File "/workspace/default/solution.py", line 17, in matpow
m2 = matpow(mat, p//2)
[Previous line repeated 990 more times]
File "/workspace/default/solution.py", line 15, in matpow
if p == 1:
RecursionError: maximum recursion depth exceeded in comparison
似乎在尝试大数时达到了递归堆栈深度,有没有一种方法可以在不使用库的情况下以优化的方式实现功能?
【问题讨论】:
-
您能否在您的问题中添加一个触发此错误的示例输入?
标签: python python-3.x math wolfram-mathematica exponential