Ebben a példában megtanuljuk a mátrixok szorzását kétféle módon: beágyazott hurok és beágyazott lista komplexitás
A példa megértéséhez ismernie kell a következő Python programozási témákat:
- Python for Loop
- Python lista
- Python mátrixok és NumPy tömbök
A Pythonban megvalósíthatunk egy mátrixot beágyazott listaként (lista a listán belül).
Minden elemet a mátrix soraként kezelhetünk.
Például X = ((1, 2), (4, 5), (3, 6))
egy 3x2
mátrixot képviselne .
Az első sor kiválasztható X(0)
. És az elem az első sorban, az első oszlopban kiválasztható X(0)(0)
.
Két X és Y mátrix szorzata csak akkor definiálható, ha az X oszlopainak száma megegyezik az Y sorok számával.
Ha X n x m
mátrix és Y m x l
mátrix, akkor XY definiálva van, és rendelkezik dimenzióval n x l
(de YX nincs meghatározva). Íme néhány módszer a mátrixszorzás Python-ban történő megvalósítására.
Forráskód: Matrix szorzás beágyazott hurok használatával
# Program to multiply two matrices using nested loops # 3x3 matrix X = ((12,7,3), (4 ,5,6), (7 ,8,9)) # 3x4 matrix Y = ((5,8,1,2), (6,7,3,0), (4,5,9,1)) # result is 3x4 result = ((0,0,0,0), (0,0,0,0), (0,0,0,0)) # iterate through rows of X for i in range(len(X)): # iterate through columns of Y for j in range(len(Y(0))): # iterate through rows of Y for k in range(len(Y)): result(i)(j) += X(i)(k) * Y(k)(j) for r in result: print(r)
Kimenet
(114, 160, 60, 27) (74., 97., 73., 14.) (119., 157., 112., 23.)
Ebben a programban egymásba ágyazott for
hurkokat használtunk az egyes sorok és oszlopok végigjátszásához. Az eredményben felhalmozzuk a termékek összegét.
Ez a technika egyszerű, de számítási szempontból drága, mivel növeljük a mátrix sorrendjét.
Nagyobb mátrix műveletekhez optimalizált szoftvercsomagokat javasolunk, mint például a NumPy, amely több (1000-es sorrendben) gyorsabb, mint a fenti kód.
Forráskód: Mátrix szorzás beágyazott lista megértésével
# Program to multiply two matrices using list comprehension # 3x3 matrix X = ((12,7,3), (4 ,5,6), (7 ,8,9)) # 3x4 matrix Y = ((5,8,1,2), (6,7,3,0), (4,5,9,1)) # result is 3x4 result = ((sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*Y)) for X_row in X) for r in result: print(r)
Ennek a programnak a kimenete megegyezik a fentiekkel. A fenti kód megértéséhez először tudnunk kell a beépített függvényről zip()
és az * operátor használatával az argumentumlista kicsomagolásáról.
A beágyazott listamegértést alkalmaztuk a mátrix egyes elemeinek iterálásához. A kód elsőre bonyolultnak és olvashatatlannak tűnik. De ha egyszer megérted a listamegértéseket, valószínűleg nem fogsz visszatérni a beágyazott ciklusokra.