我正在尝试创建一个类Matrix,它有一个名为row_echelon的方法,我正在尝试使用递归,但它不起作用。
class Matrix:
def __init__(self,matrix):
self.matrix = matrix
def row_echelon(self):
r, c = self.matrix.shape
if r == 0 or c == 0:
return self.matrix
for i in range(len(self.matrix)):
if self.matrix[i,0] != 0:
break
else:
new_matrix = self.row_echelon(self.matrix[:,1:])
return np.hstack([self.matrix[:,:1], new_matrix])
if i > 0:
ith_row = self.matrix[i].copy()
self.matrix[i] = self.matrix[0]
self.matrix[0] = ith_row
self.matrix[0] = self.matrix[0] / self.matrix[0,0]
self.matrix[1:] -= self.matrix[0] * self.matrix[1:,0:1]
new_matrix = self.row_echelon(self.matrix[1:,1:])
return np.vstack([self.matrix[:1], np.hstack([self.matrix[1:,:1], new_matrix]) ])
以下是我的输入和输出:
输入:
A = np.array([[4, 7, 3, 8],
[8, 3, 8, 7],
[2, 9, 5, 3]], dtype='float')
my_matrix = Matrix(A)
print(my_matrix.row_echelon())
输出:
TypeError
Traceback(最后一次调用(
Cell-In[43],第5行
1 A=np.array([[4,7,3,8],
2[8,3,8,7],
3[2,9,5,3]],dtype='float'(
4 my_matrix=matrix(A(---->5打印(my_matrix.row_echelon(((Cell In[42],第46行,在Matrix中。row_echelon(self(
41 self.Matrix[0]=self.matter[0]/self.Matrix[0,0]
43 self-Matrix[1:]-=self.mattric[0]*self.matric[1:,0:1]
--->46 new_matrix=self.row_echelon(self.matrix[1:,1:](
48返回np.vstack([self.matrix[:1],np.hstack([self.matric[1:,:1],new_matrix](](TypeError:Matrix.row_echelon((接受1个位置参数,但2个已给定
我不明白给出了哪两个参数?
在类函数的def row_echelon(self):
中,您定义了要使用对象引用调用的函数,但在new_matrix = self.row_echelon(self.matrix[:,1:])
中,您也将矩阵传递给函数。当您调用时,无论您是否想要,它都会自动获得self的参数-对象引用<strike]。然后,与函数一起传递的self.matrix[:,1:]
成为第二个参数。解决方案是使用除self
之外的另一个参数>而不是来定义函数,并对矩阵的副本而不是类成员matrix
进行操作。
!使现代化它终于奏效了。非常感谢大家!!这是我的代码:
def row_echelon(self):
r, c = self.matrix.shape
if r == 0 or c == 0:
return self.matrix
for i in range(len(self.matrix)):
if self.matrix[i,0] != 0:
break
else:
matrix_2 = self.matrix[:,1:]
new_matrix = Matrix(matrix_2).row_echelon()
return np.hstack([self.matrix[:,:1], new_matrix])
if i > 0:
ith_row = self.matrix[i].copy()
self.matrix[i] = self.matrix[0]
self.matrix[0] = ith_row
self.matrix[0] = self.matrix[0] / self.matrix[0,0]
self.matrix[1:] -= self.matrix[0] * self.matrix[1:,0:1]
matrix_2 = self.matrix[1:,1:]
new_matrix = Matrix(matrix_2).row_echelon()
return np.vstack([self.matrix[:1], np.hstack([self.matrix[1:,:1], new_matrix]) ])