U ovom ćemo primjeru naučiti umnožavati matrice na dva različita načina: ugniježđena petlja i, ugniježđeno proširenje popisa
Da biste razumjeli ovaj primjer, trebali biste imati znanje o sljedećim temama programiranja na Pythonu:
- Python za Loop
- Popis Pythona
- Python matrice i NumPy nizovi
U Pythonu možemo implementirati matricu kao ugniježđeni popis (popis unutar popisa).
Svaki element možemo tretirati kao red matrice.
Na primjer X = ((1, 2), (4, 5), (3, 6))
, predstavljao bi 3x2
matricu.
Prvi redak može se odabrati kao X(0)
. I, element u prvom retku, prvom stupcu može se odabrati kao X(0)(0)
.
Množenje dviju matrica X i Y definirano je samo ako je broj stupaca u X jednak broju redaka Y.
Ako je X n x m
matrica, a Y m x l
matrica, tada je XY definiran i ima dimenziju n x l
(ali YX nije definiran). Evo nekoliko načina za implementaciju množenja matrica u Pythonu.
Izvorni kod: Množenje matrice pomoću ugniježđene petlje
# 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)
Izlaz
(114, 160, 60, 27) (74, 97, 73, 14) (119, 157, 112, 23)
U ovom smo programu koristili ugniježđene for
petlje za prelazak kroz svaki redak i svaki stupac. Rezultat akumuliramo zbroj proizvoda.
Ova je tehnika jednostavna, ali računski skupa jer povećavamo redoslijed matrice.
Za veće operacije s matricom preporučujemo optimizirane softverske pakete poput NumPy koji je nekoliko (u redoslijedu od 1000) puta brži od gornjeg koda.
Izvorni kod: Množenje matrice pomoću razumijevanja ugniježđenih popisa
# 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)
Rezultat ovog programa je isti kao gore. Da bismo razumjeli gornji kod, prvo moramo znati o ugrađenoj funkciji zip()
i raspakiranju popisa argumenata pomoću operatora *.
Upotrijebili smo razumijevanje ugniježđenog popisa za itiriranje kroz svaki element u matrici. Kôd isprva izgleda složeno i nečitko. No, jednom kad naletite na poimanja popisa, vjerojatno se nećete vratiti u ugniježđene petlje.