首页 > 解决方案 > 在 Python 中使用乘法运算符进行矩阵乘法:如何?

问题描述

我想在 Python 中重载乘法运算符。我真正想做的是在 Python 中使用 * 运算符执行矩阵乘法运算。不允许使用 Numpy。

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 __matmul__(self, m):
        x = self.m_values[0].values[0]*m.m_values[0].values[0]+self.m_values[0].values[1]*m.m_values[1]*values[0]+self.m_values[0].values[2]*m.m_values[2].values[0]+self.m_values[0].values[3]*m.m_values[3].values[0]
        y = self.m_values[1].values[0]*m.m_values[0].values[1]+self.m_values[1].values[1]*m.m_values[1]*values[1]+self.m_values[1].values[2]*m.m_values[2].values[1]+self.m_values[1].values[3]*m.m_values[3].values[1]
        z = self.m_values[2].values[0]*m.m_values[0].values[2]+self.m_values[2].values[1]*m.m_values[1]*values[2]+self.m_values[2].values[2]*m.m_values[2].values[2]+self.m_values[2].values[3]*m.m_values[3].values[2]
        w = self.m_values[3].values[0]*m.m_values[0].values[3]+self.m_values[3].values[1]*m.m_values[1]*values[3]+self.m_values[3].values[2]*m.m_values[2].values[3]+self.m_values[3].values[3]*m.m_values[3].values[3]
        return Matrix4()

而不是得到如下结果:

A = Matrix4(Vec4(1, 0, 0, 0),
            Vec4(0, 1, 0, 0),
            Vec4(0, 0, 1, 0),
            Vec4(0, 0, 0, 1))

B = Matrix4(Vec4(1,2,3,4),
            Vec4(1,2,3,4),
            Vec4(1,2,3,4),
            Vec4(1,2,3,4))

print(A * B)

输出应该是:

1.00 2.00 3.00 4.00
1.00 2.00 3.00 4.00
1.00 2.00 3.00 4.00
1.00 2.00 3.00 4.00

但在我的情况下,它会导致错误:

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

我究竟做错了什么?

感谢您提前提供帮助。

标签: pythonoperator-overloadingmatrix-multiplication

解决方案


你必须通过定义重载def __mul__(self, m):


推荐阅读