Pythonský program pro násobení dvou matic

V tomto příkladu se naučíme násobit matice pomocí dvou různých způsobů: vnořená smyčka a vnořený seznam

Abychom porozuměli tomuto příkladu, měli byste znát následující témata programování v Pythonu:

  • Python pro smyčku
  • Seznam Pythonu
  • Pythonové matice a pole NumPy

V Pythonu můžeme implementovat matici jako vnořený seznam (seznam uvnitř seznamu).

S každým prvkem můžeme zacházet jako s řadou matice.

Například X = ((1, 2), (4, 5), (3, 6))by představovalo 3x2matici.

První řádek lze vybrat jako X(0). Prvek v prvním řádku, prvním sloupci lze vybrat jako X(0)(0).

Násobení dvou matic X a Y je definováno pouze v případě, že počet sloupců v X se rovná počtu řádků Y.

Pokud X je n x mmatice a Y je m x lmatice, pak je XY definováno a má dimenzi n x l(ale YX není definováno). Zde je několik způsobů, jak implementovat násobení matic v Pythonu.

Zdrojový kód: Maticové násobení pomocí vnořené smyčky

# 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) 

Výstup

 (114, 160, 60, 27) (74, 97, 73, 14) (119, 157, 112, 23) 

V tomto programu jsme použili vnořené forsmyčky k iteraci přes každý řádek a každý sloupec. Ve výsledku akumulujeme součet produktů.

Tato technika je jednoduchá, ale výpočetně nákladná, protože zvyšujeme pořadí matice.

Pro větší maticové operace doporučujeme optimalizované softwarové balíčky jako NumPy, které jsou několikrát (řádově 1000) krát rychlejší než výše uvedený kód.

Zdrojový kód: Násobení matic pomocí porozumění vnořenému seznamu

# 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) 

Výstup tohoto programu je stejný jako výše. Abychom porozuměli výše uvedenému kódu, musíme nejprve vědět o vestavěné funkci zip()a rozbalení seznamu argumentů pomocí operátoru *.

Pro iteraci každého prvku v matici jsme použili porozumění vnořeného seznamu. Kód vypadá zpočátku komplikovaně a nečitelně. Ale jakmile se dostanete na kloub porozumění seznamu, pravděpodobně se nevrátíte zpět do vnořených smyček.

Zajímavé články...