2つの行列を乗算するPythonプログラム

Pythonでは、ネストされたリスト(リスト内のリスト)として行列を実装できます。

各要素を行列の行として扱うことができます。

例えば X = [[1, 2], [4, 5], [3, 6]] を表す 3x2 マトリックス。

最初の行は次のように選択できます X[0]。 そして、最初の行、最初の列の要素は、次のように選択できます。 X[0][0]

2つの行列の乗算 バツ そして Y の列数が バツ 行数と同じです Y

場合 バツn x m マトリックスと Ym x l 次に、行列、 XY 定義され、寸法があります n x l (だが YX 定義されてない)。 Pythonで行列の乗算を実装する方法はいくつかあります。

ソースコード:ネストされたループを使用した行列の乗算

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

出力

[114, 160, 60, 27]
[74, 97, 73, 14]
[119, 157, 112, 23]

このプログラムでは、ネストされたものを使用しました for ループして、各行と各列を繰り返し処理します。 結果に製品の合計を累積します。

この手法は単純ですが、行列の次数を増やすため、計算コストが高くなります。

大規模な行列演算には、次のような最適化されたソフトウェアパッケージをお勧めします。 NumPy これは、上記のコードよりも数倍(1000のオーダー)高速です。

ソースコード:ネストされたリスト内包表記を使用した行列の乗算

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

このプログラムの出力は上記と同じです。 上記のコードを理解するには、最初に知っておく必要があります 内蔵機能 zip() そして 引数リストの解凍 *演算子を使用します。

ネストされたリスト内包表記を使用して、マトリックス内の各要素を反復処理しました。 コードは最初は複雑で読めないように見えます。 しかし、リスト内包表記のコツをつかんだら、ネストされたループに戻らないでしょう。



Hope this helps!

Source link