Množenje matrice je osnovna operacija u linearnoj algebri.
Obično ga koristimo u brojnim aplikacijama kao što su obrada slika, mašinsko učenje i još mnogo toga. NumPy je značajan Python paket za naučno računarstvo.
Međutim, u ovom postu ćemo pogledati različite metode za množenje matrice u Pythonu bez korištenja NumPy-a.
Mi ćemo iskoristiti ugniježđene petlje, ugrađenu funkciju map() i razumijevanje liste.
Osim toga, razmotrit ćemo prednosti i nedostatke svake strategije, kao i kada primijeniti svaku od njih. Ako ste novi u linearnoj algebri i želite da naučite više o množenju matrica; nastavi čitati.
Gdje koristimo množenje matrica?
Matrično množenje se koristi u računarska grafika za promjenu 2D i 3D vizuala. Na primjer, možete rotirati, skalirati i prevoditi objekte na ekranu. Matrice se koriste u obradi slike da predstave slike kao nizove piksela. Osim toga, matrice se mogu koristiti za obavljanje operacija poput filtriranja slike.
Takođe koristimo matrice u mašinsko učenje. Oni nam mogu pomoći da predstavimo podatke i parametre modela. Možemo izvoditi brojne operacije, kao što su računanje točkastih proizvoda i matrično-vektorskih proizvoda.
Svakako, ova operacija je takođe veoma korisna u naučnim operacijama. Možemo ga koristiti u fizici i inženjerstvu za opisivanje fizičkih veličina. Dakle, možemo operirati s vektorima i tenzorima.
Zašto ne možemo izabrati da koristimo NumPy?
Dok je NumPy a Python biblioteka, nije uvijek idealna opcija za množenje matrice. Možda nećemo odabrati da koristimo NumPy iz razloga kao što su veličina i ovisnost, učenje i naslijeđeni sistemi.
Korišćenje ugrađenih funkcija Pythona ili razvoj prilagođenog koda može biti efikasnije u nekim slučajevima. Međutim, ključno je napomenuti da je NumPy jaka biblioteka. Osim toga, možete ga koristiti i za množenje matrice.
Sada, hajde da pogledamo kako možemo postići množenje matrice bez NumPy-ja.
Metoda ugniježđenih petlji
Tehnika ugniježđenih petlji koristi ugniježđene petlje za izvršavanje množenja matrice u Pythonu. Funkcija ponavlja svaki element matrice. I množi ih pomoću niza ugniježđenih petlji. Funkcija vraća rezultat koji se pohranjuje u novu matricu.
Ovaj pristup je jednostavan za razumevanje. Međutim, možda neće biti tako efikasan kao drugi načini, posebno za veće matrice. Ipak, to je odličan izbor za vas ako ste novi u linearnoj algebri.
def matrix_multiplication(A, B):
# Determine the matrices' dimensions.
rows_A = len(A)
cols_A = len(A[0])
rows_B = len(B)
cols_B = len(B[0])
# Postavite matricu rezultata na nule.
result = [[0 for row in range(cols_B)] for col in
range(rows_A)]
# Iterate through rows of A
for s in range(rows_A):
# Iterate through columns of B
for j in range(cols_B):
# Iterate through rows of B
for k in range(cols_A):
result[s][j] += A[s][k] * B[k][j]
return result
Hajdemo na primjer kako se to radi. Možete samo dodati ove linije koda ispod da testirate ovaj primjer.
# Sample matrices
A = [[1, 4, 3], [4, 9, 6]]
B = [[7, 8], [9, 10], [11, 12]]
# Perform matrix multiplication
result = matrix_multiplication(A, B)
# Print the result
print(result)
# Output: [[76, 84], [175, 194]]
prednosti:
- Lako za shvatiti.
- Odlično za početnike ili one koji traže dublje razumijevanje množenja matrice.
nedostaci:
- Nije tako efikasna kao alternativne tehnike, posebno za veće matrice.
- Nije tako čitljiv kao alternativni pristupi.
metoda funkcije map().
Metoda funkcije map() pruža alternativni pristup za množenje matrice u Pythonu. U ovom pristupu koristimo ugrađenu funkciju map(). Stoga koristimo alat za funkcionalno programiranje koji primjenjuje određenu funkciju na svaki iterable element (lista, tuple, itd.). Također, funkcija map() prihvaća dva parametra, funkciju i iterable. I vraća iterator koji primjenjuje funkciju na svaki iterativni element.
U ovom pristupu, prolazimo kroz svaki član matrice i radimo množenje pomoću funkcije ugniježđene map().
Funkcija zip() se koristi za paralelno ponavljanje kroz svaki element matrice.
Konačno, funkcija sum() se koristi za zbrajanje rezultata.
def matrix_multiplication(A, B):
# To get the dimensions of the matrices
rows_A = len(A)
cols_A = len(A[0])
rows_B = len(B)
cols_B = len(B[0])
# We use map() function for multiplication.
result = [[sum(a * b for a, b in zip(row_a, col_b)) for
col_b in zip(*B)] for row_a in A]
return result
Sada, opet, možemo testirati naš kod na primjeru.
# Example matrices
A = [[3, 2, 3], [4, 5, 6]]
B = [[7, 8], [9, 10], [11, 12]]
# Use map() function to perform matrix multiplication
result = list(map(lambda x: list(map(lambda y: sum(i*j
for i,j in zip(x,y)), zip(*B))), A))
# Print the result
print(result)
# Output: [[72, 80], [139, 154]]
prednosti
- Efikasniji od pristupa sa složenim petljama
- Koristi funkcionalno programiranje da učini kod jednostavnijim.
nedostaci
- Neki ljudi koji nisu upoznati s funkcionalnim programiranjem mogu ga smatrati manje čitljivim.
- Manje je razumljiva od tehnike ugniježđenih petlji.
Metoda razumijevanja liste
Razumijevanje liste vam omogućava da generišete novu listu u jednom redu koda. Dakle, ovo je primjenom izraza na svakog člana postojeće liste.
U ovom pristupu, množenje se vrši uzastopnim ponavljanjem kroz svaki član matrice. Koristimo slojevito razumijevanje liste.
# Sample matrices
A = [[1, 12, 3], [14, 5, 6]]
B = [[7, 8], [9, 10], [12, 12]]
# Matrix multiplication using list comprehension
result = [[sum(A[i][k] * B[k][j] for k in range(len(A[0])))
for j in range(len(B[0]))] for i in range(len(A))]
# Print the result
print(result)
[[151, 164], [215, 234]]
prednosti
- U poređenju sa metodom funkcije map(), kraći i čitljiviji.
nedostaci
- To može biti manje učinkovito od korištenja funkcije map(), posebno za velike matrice.
- To je teže nego pristup ugniježđenim petljama.
zaključak
U ovom postu pogledali smo alternative korištenju NumPy-a prilikom množenja matrica u Pythonu. Izveli smo množenje matrice u ugniježđenim petljama, ugrađenu funkciju map() i razumijevanje liste.
Najbolja strategija će se oslanjati na posebne potrebe vašeg projekta.
Svaka od strategija ima svoje prednosti i nedostatke. Da biste bili sigurni da funkcija ispravno radi, dobra je ideja dodati nekoliko test slučajeva s različitim dimenzijama i vrijednostima matrice.
Također biste trebali uključiti neke testove performansi kako biste uporedili koliko dobro se ove metode izvode.
Ostavite odgovor