Množenje matrica temeljna je operacija u linearnoj algebri.
Općenito ga koristimo u brojnim aplikacijama kao što su obrada slika, strojno učenje i mnoge druge. NumPy je značajan Python paket za znanstveno računalstvo.
Međutim, u ovom ćemo postu pogledati različite metode za množenje matrica u Pythonu bez korištenja NumPyja.
Iskoristit ćemo ugniježđene petlje, ugrađenu funkciju map() i razumijevanje popisa.
Osim toga, razmotrit ćemo prednosti i nedostatke svake strategije, kao i kada svaku od njih primijeniti. Ako ste novi u linearnoj algebri i želite naučiti više o množenju matrica; nastavi čitati.
Gdje koristimo matrično množenje?
Matrično množenje se koristi u računalna grafika za promjenu 2D i 3D vizuala. Na primjer, možete rotirati, skalirati i premještati objekte na zaslonu. Matrice se koriste u obradi slike za predstavljanje slika kao nizova piksela. Osim toga, matrice se mogu koristiti za provođenje operacija poput filtriranja slike.
Također koristimo matrice u stroj za učenje. Oni nam mogu pomoći da predstavimo podatke i parametre modela. Možemo provoditi brojne operacije, kao što je izračunavanje točkastih produkata i matrično-vektorskih proizvoda.
Svakako, ova operacija je također vrlo korisna u znanstvenim operacijama. Možemo ga koristiti u fizici i inženjerstvu za opisivanje fizičkih veličina. Dakle, možemo raditi s vektorima i tenzorima.
Zašto možda ne bismo koristili NumPy?
Dok je NumPy a Python knjižnica, to nije uvijek idealna opcija za matrično množenje. Možda nećemo odlučiti koristiti NumPy iz razloga kao što su veličina i ovisnost, učenje i naslijeđeni sustavi.
Korištenje ugrađenih funkcija Pythona ili razvijanje prilagođenog koda može biti učinkovitije u nekim slučajevima. Međutim, važno je napomenuti da je NumPy snažna biblioteka. Osim toga, možete ga koristiti i za množenje matrica.
Sada, pogledajmo kako možemo postići množenje matrica bez NumPy-ja.
Metoda ugniježđenih petlji
Tehnika ugniježđenih petlji koristi ugniježđene petlje za izvođenje množenja matrice u Pythonu. Funkcija ponavlja svaki element matrice. I umnožava ih pomoću niza ugniježđenih petlji. Funkcija vraća rezultat koji se pohranjuje u novu matricu.
Ovaj pristup je jednostavan za shvatiti. Međutim, možda neće biti tako učinkovit kao drugi načini, osobito za veće matrice. Ipak, to je prekrasan 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
Uzmimo primjer kako to učiniti. Možete jednostavno dodati ove retke koda u nastavku 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.
- Izvrsno za početnike ili one koji traže dublje razumijevanje množenja matrice.
Nedostaci:
- Nije tako učinkovito kao alternativne tehnike, osobito za veće matrice.
- Nije č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 danu funkciju na svaki element koji se može ponavljati (popis, tuple, itd.). Također, funkcija map() prihvaća dva parametra, funkciju i iterable. I vraća iterator koji primjenjuje funkciju na svaki element koji se može ponoviti.
U ovom pristupu, prolazimo kroz svaki član matrice i vršimo množenje pomoću ugniježđene funkcije map().
Funkcija zip() koristi se za paralelno ponavljanje kroz svaki element matrice.
Konačno, funkcija sum() koristi se 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 s primjerom.
# 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
- Učinkovitiji od pristupa složenih petlji
- Koristi funkcionalno programiranje kako bi kôd bio jednostavniji.
Nedostaci
- Neki ljudi koji nisu upoznati s funkcionalnim programiranjem mogli bi ga smatrati manje čitljivim.
- Manje je razumljiva od tehnike ugniježđenih petlji.
Metoda razumijevanja popisa
Razumijevanje popisa omogućuje vam generiranje novog popisa u jednom retku koda. Dakle, ovo je primjenom izraza na svakog člana postojećeg popisa.
U ovom pristupu, množenje se provodi uzastopnim ponavljanjem kroz svaki član matrice. Koristimo slojevito razumijevanje popisa.
# 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 usporedbi s metodom funkcije map(), kraći i čitljiviji.
Nedostaci
- Može biti manje učinkovito od korištenja funkcije map(), osobito za velike matrice.
- To je teže od pristupa ugniježđenih petlji.
Zaključak
U ovom smo postu pogledali alternative korištenju NumPy-a pri množenju matrica u Pythonu. Izveli smo množenje matrica u ugniježđenim petljama, ugrađenu funkciju map() i razumijevanje popisa.
Najbolja strategija oslanjat će se na posebne potrebe vašeg projekta.
Svaka od strategija ima svoje prednosti i mane. Kako biste bili sigurni da funkcija ispravno radi, dobra je ideja dodati nekoliko testnih slučajeva s različitim dimenzijama i vrijednostima matrice.
Također biste trebali uključiti neke testove izvedbe kako biste usporedili koliko se te metode dobro izvode.
Ostavi odgovor