python實現矩陣乘法 不用numpy

2021-09-02 18:26:59 字數 1838 閱讀 2138

在不使用numpy庫的情況下實現矩陣乘法,看起來很簡單,但這之中也是存在坑的。比如如下**:

class

mat_mul()

:def

mm(self,a,b)

: row_len =

len(a)

column_len =

len(b[0]

) cross_len =

len(b)

res_mat =[[

0]* column_len]

* row_len

for i in

range

(row_len)

:for j in

range

(column_len)

:for k in

range

(cross_len)

: temp = a[i]

[k]* b[k]

[j] res_mat[i]

[j]+= temp

print

"==="

print res_mat

defmain()

: a =[[

1,1,

1],[

2,0,

2]] b =[[

0,1]

,[1,

0],[

1,1]

] m = mat_mul(

) m.mm(a,b)

if __name__ ==

'__main__'

: main(

)

結果本應該是

可是最終程式執行完結果卻是

最終將中間結果輸出,發現問題出現在矩陣初始化階段:

res_mat =[[

0]* row_len]

* column_len

這裡我想初始化乙個row_len*column_len的全0矩陣,所以[0]*row_len,再將新生成的list乘以coluimn_len。這裡問題就出現了:

python中,如果將list 乘以k,表面上看起來是將list複製了k份,然而事實證明這k個list所指向的記憶體中的物件只有乙個,即原始的list,也就是說如果其中乙個list被改變,k個list都會跟著變。

舉例:

c =[[

0]*2

]*2print

"before:"

,cc[0]

[1]=

3print

"after:"

,c

print

id(c[0]

),id(c[1]

)

39642936 39642936
res_mat =[[

0]* row_len for i in

range

(column_len)

]

這樣最終的結果就沒有問題啦。

原來一直以為了解python,但是對於其底層實現還掌握的太少太少。以後應該多注意這方面的學習。

ps:列表的複製方法:

lista=[1

,[2,

3]]listb=lista[:]

listb=

[i for i in lista]

listb=copy.copy(lista)

listb=copy.deepcopy(lista)

只有第五種是完全拷貝,其他在不同場合下都會出現以上問題。

矩陣乘法 矩陣乘法的基本實現

求解關於兩個矩陣的乘積 參考線性代數裡面的兩個矩陣相乘的規則,我這裡不再贅述,詳情附上了乙個鏈結,我的程式設計也是用了裡面的例子 這裡寫鏈結內容 具體的過程我會在 片裡面加上注釋 矩陣乘法 author seen 2015 09 18 include using namespace std int ...

python 矩陣乘法

1.列表作為資料結構 def matrixproduct a,b temp2 for i in range len a temp1 for j in range len b 0 total 0 for k in range len a 0 total a i k b k j return temp2...

Python 矩陣乘法

np.dot a,b 對於二維矩陣,計算真正意義上的矩陣乘積,同線性代數中矩陣乘法的定義。對於一維矩陣,計算兩者的內積。見如下python import numpy as np 2 d array 2 x 3 two dim matrix one np.array 1,2,3 4,5,6 2 d a...