2
class Matrix:
  def __init__(self, data):
    self.data = data

  def __repr__(self):
    return repr(self.data)  

  def __add__(self, other):
    data = []

    for j in range(len(self.data)):
        for k in range(len(self.data[0])):
            data.append([self.data[k] + other.data[k]])
        data.append([self.data[j] + other.data[j]])
        data = []

    return Matrix(data)  

x = Matrix([[1,2,3],[2,3,4]])
y = Matrix([[10,10,10],[10,10,10]])
print(x + y,x + x + y)

我能够让矩阵添加 1 行 x n 列,但是当我尝试通过添加第二个循环来改进所有 n x n 矩阵时,我得到了这个错误。

Traceback (most recent call last):

  line 24, in <module>
    print(x + y,x + x + y)

  line 15, in __add__
    data.append([self.data[k] + other.data[k]])

IndexError: list index out of range
4

2 回答 2

1

这个怎么样:

class Matrix:
  def __init__(self, data):
    self.data = data

  def __repr__(self):
    return repr(self.data)  

  def __add__(self, other):
    data = []

    for j in range(len(self.data)):
        data.append([])
        for k in range(len(self.data[0])):
            data[j].append(self.data[j][k] + other.data[j][k])

    return Matrix(data)
于 2011-03-16T18:00:39.920 回答
0

你的代码有几个问题...首先是加法算法的基本逻辑

data.append([self.data[k] + other.data[k]])

这种说法非常可疑……数据是一个二维矩阵,但在这里您使用单个索引访问它。data[k]因此是一整行,使用+你正在连接行(可能不是你想要的,对吗?)。可能highBandWidth是您正在寻找的解决方案。

第二个问题比较微妙,是关于语句的

self.data = data

可能是个问题,因为 Python 使用了所谓的“引用语义”。您的矩阵将使用传递的data参数作为内容但不复制它。它将存储对data您传递给构造函数的相同列表对象的引用。可能这是故意的,但可能不是……这还不清楚。如果您从相同的数据构建两个矩阵,然后在第一个中更改单个元素的内容并且第二个更改的内容对您来说可以吗?如果不是这种情况,那么您应该复制的元素data而不仅仅是分配data成员,例如使用

self.data = [row[:] for row in data]

copy.deepcopy标准复制模块使用。

第三个问题是您只使用两个空格进行缩进。这不聪明...在 python 中工作时,您应该使用 4 个空格缩进并且永远不要使用硬制表符。请注意,我说这样做(使用两个空格)并不聪明,并不是说你不聪明,所以请不要个人认为(我什至在从 python 开始时自己也犯了同样愚蠢的错误)。如果你真的想与众不同,那么可以通过在 python 中编写令人惊叹的无错误软件来实现这一点,而不仅仅是使用错误的缩进或为函数或变量选择错误的名称。专注于更高层次的美。

最后一个问题是(一旦你真正理解了为什么你的代码不起作用)你应该真正阅读 python 列表推导,如果使用得当,这个工具可以大大简化你的代码。例如,您添加的代码可能会变成

return Matrix([[a + b for a, b in zip(my_row, other_row)]
               for my_row, other_row in zip(self.data, other.data)])

对于受过训练的人来说,这比您的原始代码更容易阅读(而且速度也更快)。

于 2011-03-17T07:23:15.480 回答