python - 在 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'
我究竟做错了什么?
感谢您提前提供帮助。
解决方案
你必须通过定义重载def __mul__(self, m):
推荐阅读
- android - 为什么使用协程延迟()进行单元测试会失败?
- django - django-rest 在调用 http 删除时返回 http 301 状态码而没有斜杠
- python - 在 argparse 中存在位置参数的情况下,如何通过 = 正确传递可选参数?
- python-3.x - 无法使用 Scrapy 执行登录以进行抓取
- jquery - Shopify 主题开发 - jQuery 无法找到同级子元素
- python - 在 Python 中将图像中的颜色映射到颜色列表中最接近的成员
- postgresql - 为postgres中不存在的表创建外键
- python - 多类分类中每个类的特征重要性
- scala - Avro Schema:从 Schema 字段构建 Avro Schema
- javascript - 使用react-redux的useSelector时,生命周期中重复调用setState会报错