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

# はじめに

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

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

・3次以上の行列計算が嫌いな方
・逆行列を求めた後$\,AA^{-1}=I\,$の検算を嫌だなと思ってしまう方
・0成分が多い行列の掛け算だと集中力が切れてしまう方

# ばらす！

行列を簡単に計算するコツとは、ずばり、**ばらす**ことです！
具体的に、何をばらすかというと、足し算と掛け算です。行列の計算では、足し算と掛け算を交互に行うのでした。それを、交互ではなく、まとめてやってしまうのです。

言葉で言ってもわからないと思うので、さっそく見ていきましょう。
まず、次のような計算をしたいとしましょう。
<br>

```math:

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

```

<br>
値に特に意味はありません。

さて、これをばらすために、次の公式を使います（ブロック行列の考え方です。詳しい説明は線形代数の教科書にお譲りします）。
<br>

```math:

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

```
<br>
ここで太字は縦ベクトル、太字の右上に$\,\top\,$とあるのは、横ベクトルを表しています($\,\top\,$は転置です)。
ベクトルを行列の1つの要素とみて、行列計算しているみたいなので、覚えやすいはずです。
何言ってんのかわからん！（説明下手ですみません）という方は、すぐ下の実際の計算を見てみてください。パターンがつかめると思います。

さて、先ほどの行列にこの処方箋を用いてみましょう。
<br>

```math:
\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)

```

<br>
行列をばらすことはできたようです。



# でもこれどうやって計算するの？

ばらせたのはいいんだけど、こんなの計算したことないよって方、ご安心ください。これもただの行列と同じように計算すればいいのです。
下の式をご覧ください。<br>

```math:

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

```

<br>
九九の表を作るみたいに掛け算しているのがわかるでしょうか。この計算は、縦ベクトルや横ベクトルを行列とみなした積を表しています。
(ベクトルの内積をご存知の方に説明しておくと、内積とは縦ベクトルと横ベクトルの順序が逆です。**外積**とも呼ばれます。物理で使うものとは違いますが...
なおPythonでは`numpy.outer`で計算できます）

具体例を見た方がわかりやすいと思うので、下に書いておきます。

```math:

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

```

コツをつかめば簡単なはずです！
なお、行列の大きさが違っても同様に計算できます。

# もう計算できる！
これで、もう計算できますね。一気に計算してしまいましょう！

```math:

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


```

<br>
できました！どうでしょうか。掛け算と足し算をばらして計算しているので、負担が減ったように感じませんか？

また、次のような 0 の成分が多い例では、この裏技の威力がわかると思います。

```math:

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


```