2015-12-21 56 views
2

PEP 465添加@ infix运算符进行矩阵乘法。然而,这些列表目前尚未实现。因此,根据文档的指示,我试图实现我自己的版本__matmul__执行infix @列表

这是我第一次尝试。

class Matrices(list): 
    def __matmul__(self,matrix): 
     tempmat = [[0 for row in range(len(self))] for col in range(len(matrix))] 
     for i in range(len(self)): 
      for j in range(len(matrix[0])): 
       for k in range(len(matrix)): 
        tempmat[i][j] += self[i][k] * matrix[k][j] 
     return tempmat 

a = Matrices() 
a.append([[1,2],[3,4]])  
b = Matrices() 
b.append([[5,6],[7,8]])  
print([email protected]) 

但是我得到一个错误,

Traceback (most recent call last): 
    File "test.py", line 14, in <module> 
    print([email protected]) 
    File "test.py", line 7, in __matmul__ 
    tempmat[i][j] += self[i][k] * matrix[k][j] 
TypeError: can't multiply sequence by non-int of type 'list' 

我该如何解决这个问题?也就是说,我如何在Python中实现@字符的列表?

+0

只是在旁边 - 如果你想实施matmul,你应该使用Strassen。 – erip

+0

@erip我只是想了解python3.5中'@'的用法。无论如何,谢谢你。我会尽力去学习。谢谢:) –

+0

了解。 Strassen是替代'O(n^3)'的更快的替代品 - 我认为它是'O(n^2.8)' – erip

回答

2

更新了重写问题:很明显,无论是self[i][k]matrix[k][j]list,而不是一个int。看起来你在append以外的代码时应该是extend ing。

原始答案第一个问题

您使用[[0 for row in range(self)] for col in range(matrix)],当你可能是指包装既selfmatrixlen电话。除非出于某种疯狂的原因,您在Matrices课程上实施了__index__,这不是一个整数,所以您不能在其上覆盖range

+0

@BhargavRao:删除它实际上回答你原来的问题有点糟糕。提出一个新问题,但不要因为你有答案而删除。 – ShadowRanger

+0

好的谢谢。我会尝试你的建议。希望你不介意我的编辑。我有+你。但请保留答案的后半部分。 :) –

+0

这就是说,你需要看看错误。显然,'self [i] [k]'或'matrix [k] [j]'是一个'list',而不是'int'。看起来像是在外面的代码中追加'当你应该'延长'时。 – ShadowRanger