0

我想在 Python 中重载乘法运算符。我真正想做的是将 4x4 矩阵与 4D 向量相乘。

import math
class Vec4():
    def __init__(self, x = 0, y = 0, z = 0, w = 0):
        """Constructor for Vec4
        DO NOT MODIFY THIS METHOD"""
        self.values = [x,y,z,w]

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

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 __mul__(self, v):
        """Element wise multiplication of self by vector v
        Returns the result as a new vector"""
        x = self.m_values[0][0]*self.values[0]+self.m_values[0][1]*self.values[1]+self.m_values[0][2]*self.values[2]+self.m_values[0][3]*self.values[3]
        y = self.m_values[1][0]*self.values[0]+self.m_values[1][1]*self.values[1]+self.m_values[1][2]*self.values[2]+self.m_values[1][3]*self.values[3]
        z = self.m_values[2][0]*self.values[0]+self.m_values[2][1]*self.values[1]+self.m_values[2][2]*self.values[2]+self.m_values[3][3]*self.values[3]
        w = self.m_values[3][0]*self.values[0]+self.m_values[3][1]*self.values[1]+self.m_values[3][2]*self.values[2]+self.m_values[3][3]*self.values[3]
        return Vec4(x,y,z,w)

如您所见,我已经尝试实现它。它对我不起作用。结果应该是一个向量。

A = Matrix4(Vec4(1, 0, 0, 0),
            Vec4(0, 1, 0, 0),
            Vec4(0, 0, 1, 0),
            Vec4(0, 0, 0, 1))
>>> V = Vec4(1,2,3,4)
>>> print(A*V)

结果应为“1.00 2.00 3.00 4.00”。

但这会导致错误:

Traceback (most recent call last):
  File "<pyshell#27>", line 1, in <module>
    print(A*V)
  File "C:\Users\xxx\Downloads\Download-Stuff\Gmail\TransformMatrix.py", line 45, in __mul__
    x = self.m_values[0].values[0]*self.values[0]+self.m_values[0].values[1]*self.values[1]+self.m_values[0].values[2]*self.values[2]+self.m_values[0].values[3]*self.values[3]
AttributeError: 'Matrix4' object has no attribute 'values'

我应该怎么办?我究竟做错了什么?有人告诉我使用嵌套循环,但我不熟悉它。

请帮我!

提前致谢!

4

1 回答 1

1

你有valuesinVec4m_valuesin Matrix4。当您selfMatrix4类中引用时,这是您所指的实例Matrix4。在该类的方法中,您需要引用以self.m_values获取数组Vec4self.m_values[i].values访问Vec4.

如果您覆盖两者的索引运算符,您可能会发现它更容易。例如,对于Vec4,包含在类 def 中:

def __getitem__(self, i):
    return self.values[i]
def __setitem__(self, i, v):
    self.values[i] = v

当您深入了解如何执行此操作时,我建议您查看以下内容:https ://mathoverflow.net/questions/34173/fast-matrix-multiplication

请注意,numpy提供了高效的矩阵乘法,可能会为您节省一些麻烦。

于 2019-06-10T09:55:59.000 回答