TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

行列でベクトルはなぜ縦なのか

data augmentationを行うために、アフィン変換を行っているときにひさしぶりに行列の内積を計算したので、行列ネタについて書きます。


行列の計算ではベクトルは縦で表し、内積は以下のように計算される。

{ 
\begin{pmatrix}
a & b \\
c & d \\
\end{pmatrix}
\begin{pmatrix}
x \\
y \\
\end{pmatrix}
=
\begin{pmatrix}
ax + by \\
cx + dy \\
\end{pmatrix}
}

行列を初めて見たときに思った疑問は、なぜ\begin{pmatrix}
x \\
y \\
\end{pmatrix}が縦なの?

内積の計算結果も、x, yが横向き並んでいるなら、横じゃないの?
そもそも高校数学ではベクトルは横に並べて\begin{pmatrix}
x & y \\
\end{pmatrix}と書いていた。


ベクトルを横にして、内積の計算を以下のような定義に変更してみる。

{ 
\begin{pmatrix}
a & b \\
c & d \\
\end{pmatrix}
\begin{pmatrix}
x & y \\
\end{pmatrix}
=
\begin{pmatrix}
ax + by & cx + dy \\
\end{pmatrix}
}

さて、これで何か不都合はあるだろうか?


行列には合成ができる性質がある。


{\bf A}({\bf B}\begin{pmatrix}
x \\
y \\
\end{pmatrix})
=
({\bf A}{\bf B})\begin{pmatrix}
x \\
y \\
\end{pmatrix}

という関係があり、行列{\bf A}{\bf B}を先に計算することができる。つまり、合成ができる。


ベクトルを横で表し、内積の定義を変更した場合にも、この関係は成り立つだろうか。


{\bf A}({\bf B}\begin{pmatrix}
x & y \\
\end{pmatrix})
を変更した内積の定義で計算してみる。

\displaystyle
{\bf A} = \begin{pmatrix}
a & b \\
c & d \\
\end{pmatrix}
\\
{\bf B} = \begin{pmatrix}
e & f \\
g & h \\
\end{pmatrix}
とすると、
\begin{eqnarray}
{\bf B}\begin{pmatrix}
x & y \\
\end{pmatrix}
&=&
\begin{pmatrix}
e & f \\
g & h \\
\end{pmatrix}
\begin{pmatrix}
x & y \\
\end{pmatrix}
\\
&=&
\begin{pmatrix}
ex + fy & gx + hy \\
\end{pmatrix}

\\

{\bf A}({\bf B}\begin{pmatrix}
x & y \\
\end{pmatrix})
&=&
\begin{pmatrix}
a & b \\
c & d \\
\end{pmatrix}
\begin{pmatrix}
ex + fy & gx + hy \\
\end{pmatrix}

\\
&=&
\begin{pmatrix}
a(ex + fy) + b(gx + hy) & c(ex + fy) + d(gx + hy) \\
\end{pmatrix}

\\
&=&
\begin{pmatrix}
(ae + bg)x + (af + bh)y & (ce + dg)x + (cf + dh)y \\
\end{pmatrix}

\end{eqnarray}

次に、
({\bf A}{\bf B})\begin{pmatrix}
x & y \\
\end{pmatrix}
を計算すると、

\begin{eqnarray}
{\bf A}{\bf B}
&=&
\begin{pmatrix}
a & b \\
c & d \\
\end{pmatrix}
\begin{pmatrix}
e & f \\
g & h \\
\end{pmatrix}
\\
&=&
\begin{pmatrix}
ae + bf & ce + df \\
ag + bh & cg + dh \\
\end{pmatrix}

\\

({\bf A}{\bf B})\begin{pmatrix}
x & y \\
\end{pmatrix}
&=&
\begin{pmatrix}
ae + bf & ce + df \\
ag + bh & cg + dh \\
\end{pmatrix}
\begin{pmatrix}
x & y \\
\end{pmatrix}
\\
&=&
\begin{pmatrix}
(ae + bf)x + (ce + df)y & (ag + bh)x + (cg + dh)y \\
\end{pmatrix}


\end{eqnarray}

なお、{\bf A}{\bf B}内積は、計算結果が2×2になるように、行列と横ベクトルの計算を縦に2つ並べる形で定義した。


{\bf A}({\bf B}\begin{pmatrix}
x & y \\
\end{pmatrix})と({\bf A}{\bf B})\begin{pmatrix}
x & y \\
\end{pmatrix}
の2つの計算を見比べると、結果が一致していない

ベクトルを横ベクトルで表し、内積を上記のように定義した場合は、行列の合成を行うことができない。


2つの計算結果を一致するようにするには、行列同士の内積を以下のように定義する必要がある。

\begin{eqnarray}
{\bf A}{\bf B}
&=&
\begin{pmatrix}
a & b \\
c & d \\
\end{pmatrix}
\begin{pmatrix}
e & f \\
g & h \\
\end{pmatrix}
\\
&=&
\begin{pmatrix}
ae + bg & af + bh \\
ce + dg & cf + dh \\
\end{pmatrix}

\end{eqnarray}

あれ?普通の行列の定義に戻っている。

これでは、上記の行列と横ベクトルの内積と計算方法が違って混乱する。

一方、ベクトルを縦で表すると、n×1の行列として扱うことができ、行列同士の内積と同じ方法で計算できる。

したがって、ベクトルは縦で表した方が合理的なのである。



ちなみに、筆者の年代では高校数学では行列を習わなかった。
大学に入って、行列をはじめてみたとき、内積の計算方法が不自然に思えて、腑に落ちなかった。
なぜそのような計算方法になっているかの理由も教わらなかった。
上記のような計算をしてみることでやっと納得がいった。