Личность Матрица должна быть создана без NumPy - PullRequest
0 голосов
/ 12 мая 2019

Я должен реализовать несколько методов, которые устанавливают матрицу в единичную матрицу.Звучит просто, но мне не разрешено использовать NumPy.

class Matrix4():
    def __init__(self, row1=None, row2=None, row3=None, row4=None):
        """Constructor for Matrix4
        DO NOT MODIFY THIS METHOD"""
        if row1 is None: row1 = Vec4()
        if row2 is None: row2 = Vec4()
        if row3 is None: row3 = Vec4()
        if row4 is None: row4 = Vec4()
        self.m_values = [row1,row2,row3,row4]

    def __str__(self):
        """Returns a string representation of the matrix
        DO NOT MODIFY THIS METHOD"""
        toReturn = ''
        if self is None: return '0.00 0.00 0.00 0.00\n0.00 0.00 0.00 0.00\n0.00 0.00 0.00 0.00\n0.00 0.00 0.00 0.00'
        for r in range(0,4):
            for c in range(0,4):
                toReturn += "%.2f" % self.m_values[r].values[c]
                if c != 3:
                    toReturn += ' '
            toReturn += '\n'
        return toReturn


    def setIdentity(self):
        """Sets the current Matrix to an identity matrix
        self is an identity matrix after calling this method"""
        row1 = Vec4(1,0,0,0)
        row2 = Vec4(0,1,0,0)
        row3 = Vec4(0,0,1,0)
        row4 = Vec4(0,0,0,1)
        setIdentity.Matrix4()
        return Matrix4(row1, row2, row3, row4)

Как видите, у нас есть класс Matrix4 (), и я до сих пор реализовывал метод.Если я попытаюсь распечатать идентификационную матрицу, это не удастся.Команда

print(Matrix4())

выводит нулевую матрицу.Выполнение следующей команды

print(setIdentity.Matrix4())

говорит мне, что setIdentity не реализован.Что не так с моим кодом?

Я открыт для ваших предложений.

Спасибо!

Ответы [ 3 ]

1 голос
/ 12 мая 2019

Вы действительно должны делать это по частям, потому что вы, кажется, упускаете некоторые понятия

m = Matrix4()

Теперь у вас есть матрица из всех нулей.Затем вы хотите сделать это единичной матрицей.

m.setIdentity()

Ваша текущая реализация ломается множеством способов.

def setIdentity(self):
    """Sets the current Matrix to an identity matrix
    self is an identity matrix after calling this method"""
    row1 = Vec4(1,0,0,0)
    row2 = Vec4(0,1,0,0)
    row3 = Vec4(0,0,1,0)
    row4 = Vec4(0,0,0,1)
    #setIdentity.Matrix4()~
    #return Matrix4(row1, row2, row3, row4)
    self.m_values = [row1, row2, row3, row4]

Это устраняет две проблемы, не определяемые setIdentity,и вместо того, чтобы возвращать новую матрицу, она модифицирует существующую.

Я исправлю ваш код ответа следующим образом.

class Matrix4():
    def __init__(self, row1=None, row2=None, row3=None, row4=None):
        """Constructor for Matrix4
        DO NOT MODIFY THIS METHOD"""
        if row1 is None: row1 = Vec4()
        if row2 is None: row2 = Vec4()
        if row3 is None: row3 = Vec4()
        if row4 is None: row4 = Vec4()
        self.m_values = [row1,row2,row3,row4]

    def __str__(self):
        """Returns a string representation of the matrix
        DO NOT MODIFY THIS METHOD"""
        toReturn = ''
        if self is None: return '0.00 0.00 0.00 0.00\n0.00 0.00 0.00 0.00\n0.00 0.00 0.00 0.00\n0.00 0.00 0.00 0.00'
        for r in range(0,4):
            for c in range(0,4):
                toReturn += "%.2f" % self.m_values[r].values[c]
                if c != 3:
                    toReturn += ' '
            toReturn += '\n'
        return toReturn


    def setIdentity(self):
        """Sets the current Matrix to an identity matrix
        self is an identity matrix after calling this method"""
        #Dont do this either, it is unescessary!
        #m = Matrix4()
        row1 = Vec4(1,0,0,0)
        row2 = Vec4(0,1,0,0)
        row3 = Vec4(0,0,1,0)
        row4 = Vec4(0,0,0,1)
        self.m_values = [row1, row2, row3, row4]
        #No, do do this! this is causing the recursion!
        #m.setIdentity()
        #Stop returning a new matrix!
        #return Matrix4(row1, row2, row3, row4)

m = Matrix4()
m.setIdentity()
print(m)

Код для создания матрицы и присвоения ей идентификатора.должно быть вне вашего класса.Вы используете класс в этой точке.Я добавил комментарии над удаленной строкой.Я только изменил метод setIdentity.

0 голосов
/ 12 мая 2019
class Matrix4():
    def __init__(self, row1=None, row2=None, row3=None, row4=None):
        """Constructor for Matrix4
        DO NOT MODIFY THIS METHOD"""
        if row1 is None: row1 = Vec4()
        if row2 is None: row2 = Vec4()
        if row3 is None: row3 = Vec4()
        if row4 is None: row4 = Vec4()
        self.m_values = [row1,row2,row3,row4]

    def __str__(self):
        """Returns a string representation of the matrix
        DO NOT MODIFY THIS METHOD"""
        toReturn = ''
        if self is None: return '0.00 0.00 0.00 0.00\n0.00 0.00 0.00 0.00\n0.00 0.00 0.00 0.00\n0.00 0.00 0.00 0.00'
        for r in range(0,4):
            for c in range(0,4):
                toReturn += "%.2f" % self.m_values[r].values[c]
                if c != 3:
                    toReturn += ' '
            toReturn += '\n'
        return toReturn


    def setIdentity(self):
        """Sets the current Matrix to an identity matrix
        self is an identity matrix after calling this method"""
        m = Matrix4()
        row1 = Vec4(1,0,0,0)
        row2 = Vec4(0,1,0,0)
        row3 = Vec4(0,0,1,0)
        row4 = Vec4(0,0,0,1)
        self.m_values = [row1, row2, row3, row4]
        m.setIdentity()
        return Matrix4(row1, row2, row3, row4)

Если я использую этот код, я получу следующие ошибки в интерпретаторе: enter image description here

@ Мэтт: Вы видите, это то, что я имею в виду.

0 голосов
/ 12 мая 2019

Если вы хотите выполнить функцию setIdentity из класса Matrix4 , вам нужно написать ее следующим образом:

(class instance).function()

Следовательно, в вашем случае:

print(Matrix4().setIdentity())

Что касается вашего кода:

печать (Matrix4 ())

Он не работает, потому что вызывает конструктор ( init ) для создания экземпляра Matrix4 по умолчанию. Вам придется изменить функцию init, если вы хотите использовать другую матрицу в качестве значения по умолчанию.

...