I dette eksempel lærer vi at multiplicere matricer på to forskellige måder: indlejret løkke og indlejret listeopbygning
For at forstå dette eksempel skal du have kendskab til følgende Python-programmeringsemner:
- Python for Loop
- Python-liste
- Python-matricer og NumPy-arrays
I Python kan vi implementere en matrix som indlejret liste (liste inde i en liste).
Vi kan behandle hvert element som en række i matrixen.
For eksempel X = ((1, 2), (4, 5), (3, 6))
repræsenterer en 3x2
matrix.
Den første række kan vælges som X(0)
. Og elementet i første række, første kolonne kan vælges som X(0)(0)
.
Multiplikation af to matricer X og Y defineres kun, hvis antallet af kolonner i X er lig med antallet af rækker Y.
Hvis X er en n x m
matrix, og Y er en m x l
matrix, er XY defineret og har dimensionen n x l
(men YX er ikke defineret). Her er et par måder at implementere matrixmultiplikation i Python på.
Kildekode: Matrixmultiplikation ved hjælp af Nested Loop
# 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)
Produktion
(114, 160, 60, 27) (74, 97, 73, 14) (119, 157, 112, 23)
I dette program har vi brugt indlejrede for
sløjfer til at gentage hver række og hver kolonne. Vi akkumulerer summen af produkter i resultatet.
Denne teknik er enkel, men beregningsmæssigt dyr, da vi øger rækkefølgen af matrixen.
Til større matrixoperationer anbefaler vi optimerede softwarepakker som NumPy, som er flere gange (i størrelsesordenen 1000) gange hurtigere end ovenstående kode.
Kildekode: Matrixmultiplikation ved hjælp af indlejret listeforståelse
# 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)
Resultatet af dette program er det samme som ovenfor. For at forstå ovenstående kode skal vi først vide om indbygget funktion zip()
og udpakning af argumentlisten ved hjælp af * operator.
Vi har brugt indlejret listeforståelse til at gentage hvert element i matrixen. Koden ser kompliceret og ulæselig ud i starten. Men når du først har fået fat i listen, vil du sandsynligvis ikke gå tilbage til indlejrede sløjfer.