从父类“Matrix”到子类“Square Matrix”的继承问题

2024-03-28 21:41:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我的代码看起来是要制作一个程序来解决与矩阵相关的各种问题。这是一个我的代码,其中有所有的相关信息,我得到的错误剪贴画。在我的代码中,类矩阵(rowswap、rowmult和rowscalaradd)中的定义没有适当地继承到子类“SquareMatrix”,并给出错误“Cannot find reference‘rowswap’in‘function’”。我尝试过不同的语法但没有成功,我做错了什么

编辑:此代码的第56、59、62行出现以下错误:

在“function”中找不到引用“rowswap(然后在第59行和第62行中分别找到rowmult和rowscalaradd)”

检查信息:此检查检测应解析但不解析的名称。由于动态调度和duck类型,这在有限但有用的情况下是可能的。顶级和类级项比实例项更受支持

class Matrix:

    def __init__(self, data):
        self.data = data

    def __repr__(self): 
        outstr = ""
        for i in range(len(self.data)):
            outstr += 'Row %s = %s\n' % (i + 1, self.data[i])
        return outstr

    def rowswap(self, choice1, choice2):
        data = self.data
        row1 = self.data[choice1]
        row2 = self.data[choice2]
        data[choice1] = row2
        data[choice2] = row1
        return Matrix(data)

    def rowmult(self, scalar, rownumber):
        data = self.data
        for k in range(len(self.data[0])):
            data[rownumber][k] = (data[rownumber][k] * scalar)
        return Matrix(data)

    def rowscalaradd(self, modified, modifier, scalar):
        data = self.data
        for p in range(len(self.data[0])):
            data[modified][p] = data[modified][p] + scalar * data[modifier][p]
        return Matrix(data)


    class SquareMatrix(Matrix):
        def __init__(self, data):
            super().__init__(data)
            if len(self.data) != len(self.data[0]):
                raise ValueError('Not a square matrix')
        def identity(self):
           identity = self.data
           for i in range(len(self.data)):
              for j in range(len(self.data[0])):
                 if i == j:
                   identity[i][j] = 1
              else:
                   identity[i][j] = 0
           return Matrix(identity)

        def inverse(self):
            data = self.data
            id = self.identity
            iters = 0
            while iters < len(data):
                for j in range(0, len(self.data[0])):
                    while self.data[iters][j] == 0:
                        self.rowswap(iters, iters + 1)
                        id.rowswap(iters, iters + 1)
                    else:
                        self.rowmult(1 / data[iters][j], iters)
                        id.rowmult(1 / data[iters][j], iters)
                    for i in range(iters + 1, len(data)):
                        self.rowscalaradd(i, iters, -1 * data[i][j])
                        id.rowscalaradd(i, iters, -1 * data[i][j])
                    iters = iters + 1

Tags: 代码inselffordatalenreturndef
1条回答
网友
1楼 · 发布于 2024-03-28 21:41:16

inverse中,有一行id = self.identity没有按您的意愿执行。您可能希望调用self.identity,而不仅仅是引用它。因此,稍后在函数中尝试使用的id变量是绑定方法对象,而不是Matrix

您的代码中可能还有其他一些问题。identity方法中的identity = self.data行除了容易混淆(因为变量与方法同名)之外,也不会复制类的数据,因此当您稍后修改它时,也会修改self.data。您可能应该从头开始创建标识矩阵,而不是从数据的副本创建(如果有的话,只使用当前矩阵的大小)

相关问题 更多 >