În acest exemplu, vom învăța să înmulțim matricile folosind două moduri diferite: buclă imbricată și, listă imbricată comprenhension
Pentru a înțelege acest exemplu, ar trebui să aveți cunoștințele următoarelor subiecte de programare Python:
- Python pentru buclă
- Lista Python
- Matrici Python și matrice NumPy
În Python, putem implementa o matrice ca listă imbricată (listă într-o listă).
Putem trata fiecare element ca pe un rând al matricei.
De exemplu X = ((1, 2), (4, 5), (3, 6))
ar reprezenta o 3x2
matrice.
Primul rând poate fi selectată ca X(0)
. Și, elementul în primul rând, prima coloană poate fi selectată ca X(0)(0)
.
Înmulțirea a două matrice X și Y este definită numai dacă numărul de coloane din X este egal cu numărul de rânduri Y.
Dacă X este o n x m
matrice și Y este o m x l
matrice, XY este definit și are dimensiunea n x l
(dar YX nu este definit). Iată câteva moduri de a implementa multiplicarea matricei în Python.
Cod sursă: multiplicarea matricei folosind bucla imbricată
# 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)
Ieșire
(114, 160, 60, 27) (74, 97, 73, 14) (119, 157, 112, 23)
În acest program, am folosit for
bucle imbricate pentru a itera prin fiecare rând și fiecare coloană. Acumulăm suma produselor în rezultat.
Această tehnică este simplă, dar costisitoare din punct de vedere al calculului, pe măsură ce creștem ordinea matricei.
Pentru operațiuni cu matrice mai mari, recomandăm pachete software optimizate, cum ar fi NumPy, care este de câteva ori (în ordinea a 1000) de ori mai rapid decât codul de mai sus.
Cod sursă: multiplicarea matricei utilizând înțelegerea listei imbricate
# 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)
Rezultatul acestui program este același ca mai sus. Pentru a înțelege codul de mai sus, trebuie mai întâi să știm despre funcția încorporată zip()
și despre despachetarea listei de argumente folosind operatorul *.
Am folosit înțelegerea listei imbricate pentru a itera prin fiecare element din matrice. Codul pare la început complicat și ilizibil. Dar odată ce veți obține înțelegerea listelor, probabil că nu vă veți mai întoarce la buclele imbricate.