在不使用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...