LoginSignup
14
5

More than 1 year has passed since last update.

教科書にない!行列の快適な計算法

Last updated at Posted at 2019-02-21

はじめに

この記事では、ある日行列積を計算していた時、これならもっと楽に計算できるのではと、ふと頭に降ってき方法をご紹介します。これ、私が発明したのでは!?(誰かがもう思いついていそうですが)
しかし、学校や教科書では教えてくれないのが不思議なくらい、いい計算方法になっていますので、記事にしました。

以下の方は人生で得をします。

・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}


14
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
5