【问题标题】:__add__ matrices method in python 2.7python 2.7中的__add__矩阵方法
【发布时间】:2014-09-03 06:35:36
【问题描述】:

我是 Python 的新手,所以我需要你的帮助。 程序必须添加和减去随机矩阵。

import random
class Matrix:
    def __init__(self):
        self.mat = [[]]
    def gen_ran_numb(self,row=5,col=5):
        self.mat=[[random.randint(0,10) for z in xrange(col)] for z in xrange(row)]
    def print_matrix(self):
        print self.mat
    def __add__(self,b):
        mat=[]
        for j in range(len(self.mat)):
            temp=[]            
            for k in range(len(self.mat[0])):
                x=self.mat[j][k] + b.mat[j][k]
                temp.append(x)
            mat.append(temp)
            rez=mat
        return rez
    def __sub__(self,b):
        mat=[]
        for j in range(len(self.mat)):
            temp=[]            
            for k in range(len(self.mat)):
                x=self.mat[j][k] - b.mat[j][k]
                temp.append(x)
            mat.append(temp)            
        return mat        

a=Matrix()
b=Matrix()
c=Matrix()
a.print_matrix()
a.gen_ran_numb(5,5)
b.gen_ran_numb(5,5)
c.gen_ran_numb(5,5)
a.print_matrix()
b.print_matrix()
c.print_matrix()
print b+a
print b+a+c

如果我添加 2 个矩阵,效果很好,但如果我添加 3 或 4 个矩阵,我会出现此错误:

Traceback (most recent call last):
File "C:/Users/Вадик/Documents/Python/task.py", line 40, in <module>
print b+a+c
TypeError: can only concatenate list (not "instance") to list

我不明白我做错了什么。 请帮我。 谢谢!

【问题讨论】:

  • 你没有返回Matrix
  • 并且认为你应该写在 add.. for k in range(len(self.mat[j])): ... 如果行和列不相等..
  • 错误很明显! you couldn't add matrix

标签: python oop python-2.7 matrix add


【解决方案1】:

问题是您返回的不是Matrix 对象,而是一个实际的矩阵,即一个列表列表。因此,当您连接 2 个对象时没问题,但是当您使用 3 个对象时,您实际上是在尝试将列表对象与 Matrix 对象连接。

换句话说,只需更改函数以返回一个新实例,如下所示:

def __add__(self, b):
    res = Matrix()
    res.mat = [] #to avoid an unwanted empty list at the beginning of new matrix
    for j in range(len(self.mat)):
        temp = []            
        for k in range(len(self.mat[j])):
            x = self.mat[j][k] + b.mat[j][k]
            temp.append(x)
        res.mat.append(temp)
    return res

您可能也想同样更改__sub__

【讨论】:

  • 我像你一样编辑代码,但出现错误:<__main__.matrix instance at>
  • @user3675561 这不是错误。这是新 Matrix 对象的字符串表示形式。像任何其他对象一样使用它(即,调用.print_matrix() 打印它)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 2011-11-20
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多