【入門】アフィン行列の合成【数値計算】

【入門】アフィン行列の合成【数値計算】 数値計算
【入門】アフィン行列の合成【数値計算】

MATLAB、Python、Scilab、Julia比較ページはこちら
https://www.simulationroom999.com/blog/comparison-of-matlab-python-scilab/

はじめに

の、

MATLAB,Python,Scilab,Julia比較 第3章 その77【アフィン行列の合成①】
MATLAB,Python,Scilab,Julia比較 第3章 その78【アフィン行列の合成②】
MATLAB,Python,Scilab,Julia比較 第3章 その79【アフィン行列の合成③】

を書き直したもの。

アフィン変換のアフィン行列の合成の話。
その理屈、Σの性質、行列の結合法則について説明する。

アフィン行列の合成

前回は、アフィン変換を実際にプログラムしたが、
アフィン変換としては、まだ入り口たったあたりだったりする。

アフィン変換を突き詰めていくと、
アフィン行列の合成の話が出てくる。

アフィン変換シリーズの最初に伸縮、移動、回転のアフィン変換をアニメーションgifにしたものがあった。

犬と自転車-X軸伸縮Y軸伸縮回転アフィン変換
犬と自転車-X軸伸縮Y軸移動回転アフィン変換

これは、個別にアフィン変換したのではなく、伸縮、移動、回転のアフィン行列を合成して、アフィン変換自体は1フレーム毎1回のみ実施している。

アフィン行列の合成の具体例

試しに移動アフィンと回転アフィンを合成してみよう。
まずはそれぞれのアフィン変換の式を見てみよう。

移動アフィン

\(
\begin{bmatrix}
x\prime\\
y\prime\\
1
\end{bmatrix}=
\begin{bmatrix}
1 & 0 & 0.5 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{bmatrix}
\begin{bmatrix}
x\\
y\\
1
\end{bmatrix}
\)

回転アフィン

\(
\begin{bmatrix}
x\prime\\
y\prime\\
1
\end{bmatrix}=
\begin{bmatrix}
\cos(30^\circ) & -\sin(30^\circ) & 0 \\
\sin(30^\circ) & \cos(30^\circ) & 0 \\
0 & 0 & 1
\end{bmatrix}
\begin{bmatrix}
x\\
y\\
1
\end{bmatrix}
\)

そして、移動したあとに回転させる場合は以下になる。

\(
\begin{bmatrix}
x\prime\\
y\prime\\
1
\end{bmatrix}=
\begin{bmatrix}
\cos(30^\circ) & -\sin(30^\circ) & 0 \\
\sin(30^\circ) & \cos(30^\circ) & 0 \\
0 & 0 & 1
\end{bmatrix}
\begin{bmatrix}
1 & 0 & 0.5 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{bmatrix}
\begin{bmatrix}
x\\
y\\
1
\end{bmatrix}
\)

実施したいアフィン変換の行列を後ろから並べていく。
先に移動アフィンの計算をして、その後に回転の計算をするからイメージともあってるだろう。

しかし、その考え方だと、行列を合成していることにならない。
行列を合成ということは、
回転アフィン行列と、移動アフィン行列を先に計算して、そのあとにアフィン変換をすることになるはずだ。
これに対しては行列の結合法則を適用させることで解決する。

行列の結合法則

行列は結合法則が成り立つ。
結合法則とは以下のような性質。

\(
(AB)C=A(BC)
\)

普通のスカラーに対してだったら当たり前の話だが、
行列にも成立する。
※ 尚、順序を入れ替える交換法則は行列では成立しない。

Σの性質

行列の結合法則を証明したいが、その前に\(\sum\)の性質を把握しておく必要がある。
実は以下が成立する。

\(
\displaystyle\sum_{i=1}^m \sum_{j=1}^n a_i b_j=\sum_{i=1}^m a_i \sum_{j=1}^n b_i=\sum_{j=1}^n \bigg(\sum_{i=1}^m a_i\bigg) b_j
\)

Excelの表の合計値の算出のイメージをしてもらえればOKなのだが、
まじめの証明をしておこう。

\(
\begin{eqnarray}
\displaystyle\sum_{i=1}^m \sum_{j=1}^n a_i b_j&=&\sum_{i=1}^m(a_ib_1+a_ib_2+\dots+a_ib_n)\\
&=&b_1\sum_{i=1}^m a_i+b_2\sum_{i=1}^m a_i+\dots+b_n\sum_{i=1}^m a_i\\
&=&(b_1+b_2+\dots+b_n)\sum_{i=1}^m a_i\\
&=&\sum_{i=1}^m a_i \sum_{j=1}^n b_i
\end{eqnarray}
\)

\(
\begin{eqnarray}
\displaystyle\sum_{j=1}^n \bigg(\sum_{i=1}^m a_i\bigg) b_j&=&\sum_{j=1}^n(a_1b_j+a_2b_j+\dots+a_mb_j)\\
&=&a_1\sum_{j=1}^n b_i+a_2\sum_{j=1}^n b_i+\dots+a_m\sum_{j=1}^n b_i\\
&=&(a_1+a_2+\dots+a_m)\sum_{j=1}^n b_i\\
&=&\sum_{i=1}^m a_i \sum_{j=1}^n b_i
\end{eqnarray}
\)

両方とも\(\displaystyle\sum_{i=1}^m a_i \sum_{j=1}^n b_i\)になるので、
結果として全部等しいって理屈になる。

次のページへ

「行列の結合法則の証明」の話。

コメント

タイトルとURLをコピーしました