前回は行列の操作について説明しました。今回は行列の計算についてです。基本的にはベクトルと同じですが、行列の計算に関しては高校や大学で学んでいなければ難しい部分もあると思います。少し複雑でわからない部分は読み飛ばしても問題ありません。
行列と数値の計算
行列と数値の計算はベクトルの場合と同様です。行列の各要素に対して一括で四則演算を行うことができます。今回からは入力と実行結果を分けずに記載していきます。
A = [1 2 3; 4 5 6; 7 8 9]
A + 10
A =
1 2 3
4 5 6
7 8 9
ans =
11 12 13
14 15 16
17 18 19
1行目で行列Aを作成し、2行目で行列Aに対し10を加算しました。その結果全ての要素に対して10が加算されました。同様に掛け算を行うと、
A = [1 2 3; 4 5 6; 7 8 9]
A * 10
A =
1 2 3
4 5 6
7 8 9
ans =
10 20 30
40 50 60
70 80 90全ての要素が10倍になりました。引き算、割り算に対しても同様の結果となります。
行列同士の足し引き
続いては行列同士の足し引きです。
A = [1 2 3; 4 5 6; 7 8 9]
B = randi(10,3)
A + B
A =
1 2 3
4 5 6
7 8 9
B =
7 1 8
4 5 8
10 4 2
ans =
8 3 11
8 10 14
17 12 111行目で行列Aを作成しました。2行目ではrandi関数を使って行列Bを作成しました。randi関数はランダムな整数を出力する関数です。1つ目の引数10は最大値を表し、2つ目の引数は3行3列の正方行列を作成することを示します。A + Bの結果はAとBの各要素同士の足し算の結果となります。引き算に関しても同様です。
行列の掛け算
行列の掛け算に関しては数学で行列の掛け算を学習していない人は飛ばしても問題ありません。先ほど生成した行列A, Bの掛け算を行います。
A * B
ans =
45 23 30
108 53 84
171 83 138意図通り計算できていることがわかります。例えば1行1列目の結果は1*7 + 2*4 + 3*10 = 45となり上記の結果と一致します。行列の掛け算は(n行m列)×(m行k列)の場合結果が(n行k列)になります。1つ目の行列の列数と2つ目の行列の行数が一致しない場合エラーとなります。
行列の割り算
続いては行列の割り算になります。こちらも掛け算と同様、行列の基礎知識がある前提となります。先ほどと同じ行列A, Bを用いて割り算をして行列Cに代入します。
A = [1 2 3; 4 5 6; 7 8 9];
B = [7 1 8; 4 5 6; 10 4 2];
C = A / B
C =
0.0377 0.4906 -0.1226
0 1.0000 0
-0.0377 1.5094 0.1226結果の確認のため、行列Cに行列Bをかけると行列Aと一致するか確認します。
C * B
ans =
1.0000 2.0000 3.0000
4.0000 5.0000 6.0000
7.0000 8.0000 9.0000C*Bを計算すると、1.0000など小数の表記となりましたが、値自体は元の行列Aと一致していることがわかります。
逆行列
MATLABで逆行列を計算する関数は「inv」関数です。先ほどの行列Bの逆行列を求めて行列Dとします。
D = inv(B)
D =
0.0440 -0.0943 0.1069
-0.1635 0.2075 0.0314
0.1069 0.0566 -0.0975DはBの逆行列なので、A/BとA*Dは一致するはずなので、A*Dを計算します。
A * D
ans =
0.0377 0.4906 -0.1226
-0.0000 1.0000 0.0000
-0.0377 1.5094 0.1226先ほど求めた行列C(A/Bの結果)と一致していることがわかります(表記は若干異なっています)。
行列の掛け算や割り算、逆行列の計算は手計算で行うにはかなり苦労するため、MATLABを使用するメリットが十分感じられたのではないでしょうか。
まとめ
行列の計算について説明しました。行列と数値の計算、行列同士の足し引きはとてもシンプルでしたが、行列同士の掛け算や割り算に関しては、少し数学の知識が必要になりました。一方で面倒な計算をほんの数行で実行してくれるメリットも感じられたと思います。次回はスクリプトファイルの作成について説明したいと思います。
コメント