我试图编写代码,使用for循环而不是矢量化在矩阵上执行高斯消元法。我的代码如下:
def myGaussJordan(A,m): """ 在A上执行Gauss Jordan消除。
A: a square matrix.
m: the pivot element is A[m, m].
Returns a matrix with the identity matrix
on the left and the inverse of A on the right.
"""
B = np.column_stack((A,np.identity(m)))
C = B
for i in range(0,m):
B[i,] = B[i,]/B[i,i]
tmp = list(range(0,m))
tmp.remove(i) ## remove the row since we only operate on other rows
for j in tmp:
for k in range(0,(2*m)):
B[j,k] = C[j,k] - C[i,k]*(C[j,i]/C[i,i])
C = B
return B
我需要C,以便在B的右侧跟踪行操作,以生成逆矩阵。通过调试器,似乎第一个" k"循环按预期工作,但是一旦C = B,Python会在后续代码中同时更新C和B,从而导致错误。
另外我注意到我向k循环了,相同的代码运行良好。此外,我运行在R中编码的相同方法,它可以工作,所以我很困惑。
我是否遗漏了Python对变量或缩进的分配?