【Python】数学の行列の積を計算するプログラムをPythonで書き直してみた
先日の行列積計算プログラムをPythonで書き直してみました。
Javaも初めてだったけど、Pythonも初めて。
ここまでくるのも七転八倒。
まずはソースコードから。
コード
################################
def mulMatrix ( matrix1, matrix2 ):
mul = [
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
]
for row in range(0, 10):
for col in range(0, 10):
mul[row][col] = 0
for i in range(0, 10):
mul[row][col] = mul[row][col] + matrix1[row][i] * matrix2[i][col]
return mul
################################
A = [
[-31, 2, 2, -4, 10, 19, 13, 3, 23, -31],
[-27, 1, 3, -4, 10, 21, 13, 5, 19, -27],
[-19, 1, 2, -3, 8, 15, 9, 5, 13, -19],
[ 9, -1, 0, 1, -2, -3, -3, 1, -7, 9],
[ 21, -1, -2, 3, -7, -14, -9, -3, -15, 21],
[ 17, -1, -2, 3, -7, -12, -7, -5, -11, 17],
[-36, 2, 4, -6, 14, 25, 15, 9, 24, -36],
[-19, 1, 2, -3, 7, 13, 8, 4, 13, -19],
[-14, 1, 1, -2, 5, 9, 6, 2, 10, -14],
[ 17, -1, -1, 2, -5, -10, -7, -1, -13, 17],
]
################################
A_square = mulMatrix(A, A)
A_cube = mulMatrix(A_square, A)
print("A")
print(A)
print("")
print("A_square")
print(A_square)
print("")
print("A_cube")
print(A_cube)
print("")
################################
実行結果
A
[[-31, 2, 2, -4, 10, 19, 13, 3, 23, -31], [-27, 1, 3, -4, 10, 21, 13, 5, 19, -27], [-19, 1, 2, -3, 8, 15, 9, 5, 13, -19], [9, -1, 0, 1, -2, -3, -3, 1, -7, 9], [21, -1, -2, 3, -7, -14, -9, -3, -15, 21], [17, -1, -2, 3, -7, -12, -7, -5, -11, 17], [-36, 2, 4, -6, 14, 25, 15, 9, 24, -36], [-19, 1, 2, -3, 7, 13, 8, 4, 13, -19], [-14, 1, 1, -2, 5, 9, 6, 2, 10, -14], [17, -1, -1, 2, -5, -10, -7, -1, -13, 17]]
A_square
[[-8, 0, 2, -2, 4, 8, 4, 4, 4, -8], [-4, 0, 1, -1, 2, 4, 2, 2, 2, -4], [-4, 0, 1, -1, 2, 4, 2, 2, 2, -4], [4, 0, -1, 1, -2, -4, -2, -2, -2, 4], [4, 0, -1, 1, -2, -4, -2, -2, -2, 4], [4, 0, -1, 1, -2, -4, -2, -2, -2, 4], [-8, 0, 2, -2, 4, 8, 4, 4, 4, -8], [-4, 0, 1, -1, 2, 4, 2, 2, 2, -4], [-4, 0, 1, -1, 2, 4, 2, 2, 2, -4], [4, 0, -1, 1, -2, -4, -2, -2, -2, 4]]
A_cube
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
気になった点をいくつか。
(1)配列表示
配列を渡せば丸ごと表示してくれるライブラリがあるので、表示するコードは書かずにすみました。
(2)サブ関数の定義
サブ関数を先に書かなきゃいけないんだな。
インタプリタの宿命だろうか。
C や C++ にしたところでが、先にプロトタイプ宣言が必要なんであってどっこいどっこいなのかもしれない。
C#、Javaはそれさえも必要がないけれども。
Pythonも他に書きようはあるのかもしれないが詳しくない。
(3)ループの書式
ループの書式はこれ。
for row in range(0, 10):
どうなんだろうな。
この「range (0, 10)」だけれども、 row は 0~9 の範囲を繰り返す。 10 は含まない。
C++ で言うところの「for (i = 0; i < 10; i++)」と同じなんだが、 C++ では「<」の記号で 10 を含まないことを知れる。
が、「range (0, 10)」はどうだろう。
10 を含まないと思うだろうか。
(4)配列
配列と言っていいんだろうか。
空の配列を用意する方法がわからなかった。
なので、0を百個も書くはめになってしまった。
さて、他にツッコミどころはあるだろうか。
こんなに短文でも書き方はいろいろあるものだ。
あなたならどう書く?