2015-12-21 59 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