A mátrixszorzás a lineáris algebra alapvető művelete.
Általában számos alkalmazásban használjuk, például képfeldolgozásban, gépi tanulásban és még sok másban. A NumPy egy figyelemre méltó Python-csomag a tudományos számítástechnikához.
Ebben a bejegyzésben azonban különféle módszereket fogunk megvizsgálni a mátrixszorzás Pythonban a NumPy használata nélkül.
Használni fogjuk beágyazott hurkok, a beépített map() függvény és a listaértés.
Ezenkívül megvizsgáljuk az egyes stratégiák előnyeit és hátrányait, valamint azt, hogy mikor kell alkalmazni őket. Ha még nem ismeri a lineáris algebrát, és többet szeretne megtudni a mátrixszorzásról; olvass tovább.
Hol használjuk a mátrixszorzást?
A mátrixszorzást használják számítógépes grafika a 2D és 3D látványelemek módosításához. Például elforgathatja, méretezheti és lefordíthatja a képernyőn lévő objektumokat. A mátrixokat a képfeldolgozás során arra használják, hogy a képeket pixeltömbként ábrázolják. Ezenkívül a mátrixok olyan műveletek végrehajtására is használhatók, mint a képszűrés.
Használunk mátrixokat is gépi tanulás. Segíthetnek az adatok ábrázolásában és a modellparaméterek ábrázolásában. Számos műveletet végezhetünk, például pontszorzatok és mátrix-vektor szorzatok számítását.
Bizonyára ez a művelet a tudományos műveleteknél is nagyon előnyös. Használhatjuk a fizikában és a mérnöki tudományokban fizikai mennyiségek leírására. Ezért tudunk vektorokkal és tenzorokkal operálni.
Miért nem választhatjuk a NumPy használatát?
Míg a NumPy a Python könyvtár, nem mindig ez az ideális lehetőség mátrixszorzáshoz. Előfordulhat, hogy nem választjuk a NumPy használatát olyan okok miatt, mint a méret és a függőség, a tanulás és a régi rendszerek.
A Python beépített funkcióinak használata vagy egyéni kód fejlesztése bizonyos esetekben hatékonyabb lehet. Kulcsfontosságú azonban megjegyezni, hogy a NumPy erős könyvtár. Emellett mátrixszorzáshoz is használhatja.
Most pedig nézzük meg, hogyan érhetjük el a mátrixszorzást NumPy nélkül.
Beágyazott hurkok módszer
A beágyazott hurkok technika beágyazott ciklusokat használ a mátrixszorzás végrehajtására Pythonban. A függvény minden mátrixelemen keresztül ismétlődik. És megszorozza őket egy sor egymásba ágyazott hurok segítségével. A függvény az eredményt adja vissza, amelyet egy új mátrixban tárol.
Ez a megközelítés egyszerűen megragadható. Előfordulhat azonban, hogy nem olyan hatékony, mint más módszerek, különösen nagyobb mátrixok esetén. Mégis, ez egy csodálatos választás az Ön számára, ha még nem ismeri a lineáris algebrát.
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])
# Állítsa az eredménymátrixot nullákra.
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
Lássunk egy példát, hogyan kell ezt megtenni. A példa teszteléséhez egyszerűen hozzáadhatja ezeket a kódsorokat alább.
# 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]]
Előnyök:
- Könnyen érthető.
- Kiváló kezdőknek vagy azoknak, akik mélyebb megértést keresnek a mátrixszorzásban.
Hátrányok:
- Nem olyan hatékony, mint az alternatív technikák, különösen nagyobb mátrixok esetén.
- Nem annyira olvasható, mint az alternatív megközelítések.
map() függvény metódus
A map() függvény metódus alternatív megközelítést kínál a mátrixszorzáshoz Pythonban. Ebben a megközelítésben a beépített map() függvényt használjuk. Ezért olyan funkcionális programozási eszközt használunk, amely minden iterálható elemre (lista, sor stb.) egy megadott függvényt alkalmaz. Ezenkívül a map() függvény két paramétert fogad el, egy függvényt és egy iterálhatót. És visszaad egy iterátort, amely minden iterálható elemre alkalmazza a függvényt.
Ebben a megközelítésben végigmegyünk a mátrix minden egyes tagján, és a beágyazott map() függvény segítségével végezzük el a szorzást.
A zip() függvény a mátrixok minden elemének párhuzamos iterálására szolgál.
Végül a sum() függvényt használjuk az eredmények összeadására.
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
Most ismét egy példán keresztül tesztelhetjük kódunkat.
# 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]]
Előnyök
- Hatékonyabb, mint a halmozott hurkok megközelítés
- Funkcionális programozást használ, hogy egyszerűbbé tegye a kódot.
Hátrányok
- Néhány ember, aki nem ismeri a funkcionális programozást, kevésbé olvasható.
- Kevésbé érthető, mint a beágyazott hurkok technika.
Lista megértési módszer
A listaértés lehetővé teszi, hogy egyetlen kódsorban új listát hozzon létre. Ezért ez egy kifejezés alkalmazása egy létező lista minden tagjára.
Ebben a megközelítésben a szorzás az egyes mátrixtagokon való ismételt iterációval történik. Réteges listaértést használunk.
# 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]]
Előnyök
- A map() függvénymódszerhez képest rövidebb és olvashatóbb.
Hátrányok
- Lehet, hogy kevésbé hatékony, mint a map() függvény használata, különösen nagy mátrixok esetén.
- Ez nehezebb, mint a beágyazott hurkok megközelítés.
Következtetés
Ebben a bejegyzésben megvizsgáltuk a NumPy használatának alternatíváit a mátrixok Pythonban történő szorzásakor. Mátrixszorzást végeztünk beágyazott ciklusokban, a beépített map() függvényt és listaértést.
A legjobb stratégia a projekt sajátos igényein alapul.
Mindegyik stratégiának megvannak a maga előnyei és hátrányai. A függvény megfelelő működésének biztosítása érdekében érdemes néhány tesztesetet hozzáadni különféle mátrixdimenziókkal és -értékekkel.
Néhány teljesítménytesztet is tartalmaznia kell, hogy összehasonlítsa, milyen jól működnek ezek a módszerek.
Hagy egy Válaszol