Проблемы с наследованием от родительского класса «Матрица» к дочернему классу «Квадратная матрица» - PullRequest
0 голосов
/ 12 марта 2019

Мой код выглядит как программа, которая решает различные задачи, связанные с матрицами. Это фрагмент моего кода, который содержит всю необходимую информацию об ошибке, которую я получаю. В моем коде определения класса Matrix (rowswap, rowmult и rowscalaradd) не наследуются надлежащим образом дочернему классу "SquareMatrix" и выдают ошибку "Не удается найти ссылку 'rowswap' в 'function'". Я пробовал другой синтаксис безуспешно, что я делаю не так?

edit: ошибка появляется в строках 56,59,62 этого кода со следующим:

Невозможно найти ссылку 'rowswap (затем впоследствии rowmult и rowscalaradd соответственно в строках 59 и 62)' в 'функции'

Информация о проверке: эта проверка обнаруживает имена, которые должны разрешаться, но не разрешаются. Из-за динамического распределения и типизации утки это возможно в ограниченном, но полезном количестве случаев. Элементы верхнего уровня и класса поддерживаются лучше, чем элементы экземпляра.

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

1 Ответ

1 голос
/ 12 марта 2019

В inverse у вас есть строка id = self.identity, которая не выполняет то, что вы намерены.Вы, вероятно, хотите, чтобы звонил self.identity, а не просто ссылался на него.В результате переменная id, которую вы пытаетесь использовать позже в функции, является объектом связанного метода, а не Matrix.

Возможно, в вашем коде есть другие проблемы.Строка identity = self.data в методе identity, помимо того, что она запутана (поскольку переменная имеет то же имя, что и метод), также не создает копию данных класса, поэтому при ее последующем изменении выМодифицируем self.data тоже.Вам, вероятно, следует создать идентификационную матрицу с нуля, а не из копии данных (используйте только текущий размер матрицы, если что-нибудь).

...