はじめに
この記事では、ある日行列積を計算していた時、これならもっと楽に計算できるのではと、ふと頭に降ってき方法をご紹介します。これ、私が発明したのでは!?(誰かがもう思いついていそうですが)
しかし、学校や教科書では教えてくれないのが不思議なくらい、いい計算方法になっていますので、記事にしました。
以下の方は人生で得をします。
・3次以上の行列計算が嫌いな方
・逆行列を求めた後$,AA^{-1}=I,$の検算を嫌だなと思ってしまう方
・0成分が多い行列の掛け算だと集中力が切れてしまう方
ばらす!
行列を簡単に計算するコツとは、ずばり、ばらすことです!
具体的に、何をばらすかというと、足し算と掛け算です。行列の計算では、足し算と掛け算を交互に行うのでした。それを、交互ではなく、まとめてやってしまうのです。
言葉で言ってもわからないと思うので、さっそく見ていきましょう。
まず、次のような計算をしたいとしましょう。
\left(
\begin{array}{ccc}
0 & 1 & 2\\
1 & 3 & 4\\
1 & -1 & -2\\
0 & 1 & 1
\end{array}
\right)
\left(
\begin{array}{ccc}
0 & -1 & -3\\
-1 & 1 & 2\\
1 & 0 & 2
\end{array}
\right)
値に特に意味はありません。
さて、これをばらすために、次の公式を使います(ブロック行列の考え方です。詳しい説明は線形代数の教科書にお譲りします)。
\left(\bf{x_1}\ \bf{x_2}\ \bf{x_3} \right)
\left(\begin{array}{c}
\bf{y_1^\top} \\
\bf{y_2^\top} \\
\bf{y_3^\top}
\end{array}
\right) \\
= \bf{x_1}\bf{y_1^\top}+\bf{x_2}\bf{y_2^\top}+\bf{x_3}\bf{y_3^\top}
ここで太字は縦ベクトル、太字の右上に$\,\top\,$とあるのは、横ベクトルを表しています($\,\top\,$は転置です)。 ベクトルを行列の1つの要素とみて、行列計算しているみたいなので、覚えやすいはずです。 何言ってんのかわからん!(説明下手ですみません)という方は、すぐ下の実際の計算を見てみてください。パターンがつかめると思います。
さて、先ほどの行列にこの処方箋を用いてみましょう。
\left(
\begin{array}{ccc}
0 & 1 & 2\\
1 & 3 & 4\\
1 & -1 & -2\\
0 & 1 & 1
\end{array}
\right)
\left(
\begin{array}{ccc}
0 & -1 & -3\\
-1 & 1 & 2\\
1 & 0 & 2
\end{array}
\right)
\\
=\left(
\begin{array}{ccc}
0 \\
1 \\
1 \\
0
\end{array}
\right)\left(
\begin{array}{ccc}
0 & -1 & -3
\end{array}
\right) + \left(
\begin{array}{ccc}
1 \\
3 \\
-1 \\
1
\end{array}
\right)\left(
\begin{array}{ccc}
-1 & 1 & 2
\end{array}
\right) +
\left(
\begin{array}{ccc}
2\\
4\\
-2\\
1
\end{array}
\right)\left(
\begin{array}{ccc}
1 & 0 & 2
\end{array}
\right)
行列をばらすことはできたようです。
でもこれどうやって計算するの?
ばらせたのはいいんだけど、こんなの計算したことないよって方、ご安心ください。これもただの行列と同じように計算すればいいのです。
下の式をご覧ください。
\left(
\begin{array}{c}
a_1 \\
a_2 \\
a_3 \\
a_4
\end{array}
\right)\,\left(\begin{array}{ccc}b_1&b_2&b_3 \end{array}\right)
= \left(
\begin{array}{ccc}
a_1 b_1 & a_1 b_2 & a_1 b_3\\
a_2 b_1 & a_2 b_2 & a_2 b_3\\
a_3 b_1 & a_3 b_2 & a_3 b_3\\
a_4 b_1 & a_4 b_2 & a_4 b_3
\end{array}
\right)
九九の表を作るみたいに掛け算しているのがわかるでしょうか。この計算は、縦ベクトルや横ベクトルを行列とみなした積を表しています。 (ベクトルの内積をご存知の方に説明しておくと、内積とは縦ベクトルと横ベクトルの順序が逆です。**外積**とも呼ばれます。物理で使うものとは違いますが... なおPythonでは`numpy.outer`で計算できます)
具体例を見た方がわかりやすいと思うので、下に書いておきます。
\left(
\begin{array}{c}
1 \\
2 \\
3 \\
4
\end{array}
\right)\, \left(\begin{array}{ccc}
0 & 2 & 4
\end{array}
\right)
= \left(
\begin{array}{ccc}
0 & 2 & 4\\
0 & 4 & 8\\
0 & 6 & 12\\
0 & 8 & 16
\end{array}
\right)
コツをつかめば簡単なはずです!
なお、行列の大きさが違っても同様に計算できます。
もう計算できる!
これで、もう計算できますね。一気に計算してしまいましょう!
\begin{align}
&\left(
\begin{array}{ccc}
0 & 1 & 2\\
1 & 3 & 4\\
1 & -1 & -2\\
0 & 1 & 1
\end{array}
\right)
\left(
\begin{array}{ccc}
0 & -1 & -3\\
-1 & 1 & 2\\
1 & 0 & 2
\end{array}
\right)
\\
&=\left(
\begin{array}{ccc}
0 \\
1 \\
1 \\
0
\end{array}
\right)\left(
\begin{array}{ccc}
0 & -1 & -3
\end{array}
\right) + \left(
\begin{array}{ccc}
1 \\
3 \\
-1 \\
1
\end{array}
\right)\left(
\begin{array}{ccc}
-1 & 1 & 2
\end{array}
\right) +
\left(
\begin{array}{ccc}
2\\
4\\
-2\\
1
\end{array}
\right)\left(
\begin{array}{ccc}
1 & 0 & 2
\end{array}
\right)
\\
&= \left(
\begin{array}{ccc}
0 & 0 & 0\\
0 & -1 & -3\\
0 & -1 & -3\\
0 & 0 & 0
\end{array}
\right)+
\left(
\begin{array}{ccc}
-1 & 1 & 2 \\
-3 & 3 & 6\\
1 & -1 & -2\\
-1 & 1 & 2
\end{array}
\right)+
\left(
\begin{array}{ccc}
2 & 0 & 4\\
4 & 0 & 8\\
-2 & 0 & -4\\
1 & 0 & 2
\end{array}
\right)
\\
&=\left(
\begin{array}{ccc}
1 & 1 & 6\\
1 & 2 & 11\\
-1 & -2 & -9\\
0 & 1 & 4
\end{array}
\right)
\end{align}
できました!どうでしょうか。掛け算と足し算をばらして計算しているので、負担が減ったように感じませんか?
また、次のような 0 の成分が多い例では、この裏技の威力がわかると思います。
\begin{align}
&\left(
\begin{array}{ccc}
0 & 1 & 0\\
0 & 0 & 2\\
0 & 0 & 0
\end{array}
\right)
\left(
\begin{array}{ccc}
0 & 0 & 1\\
0 & 0 & 2\\
0 & 0 & 0
\end{array}
\right)
\\
&=\left(
\begin{array}{ccc}
0 \\
0 \\
0
\end{array}
\right)\left(
\begin{array}{ccc}
0 & 0 & 1
\end{array}
\right) + \left(
\begin{array}{ccc}
1 \\
0\\
0
\end{array}
\right)\left(
\begin{array}{ccc}
0 & 0 & 2
\end{array}
\right) +
\left(
\begin{array}{ccc}
0\\
2\\
0
\end{array}
\right)\left(
\begin{array}{ccc}
0 & 0 & 0
\end{array}
\right)
\\
&=\ O+
\left(
\begin{array}{ccc}
0&0&2\\
0&0&0\\
0&0&0
\end{array}
\right)+O
\\
&=\left(
\begin{array}{ccc}
0&0&2\\
0&0&0\\
0&0&0
\end{array}
\right)
\end{align}