3×3の歪対称行列の特異値分解

エピポーラ幾何の基本行列(Essential matrix)を分解する問題には次のような式が出てくるかと思います．

```math
\left\lbrack T \right\rbrack_{\times} = \begin{bmatrix}
\mathbf{v} & \mathbf{- u} & \mathbf{w} \\
\end{bmatrix}\text{diag}\left( \left\| \mathbf{t} \right\|,\left\| \mathbf{t} \right\|,0 \right)\begin{bmatrix}
\mathbf{u} & \mathbf{v} & \mathbf{w} \\
\end{bmatrix}^{\top}
```

ここで，$\left\lbrack T \right\rbrack_{\times}$は3×3の歪対称行列です．上式は多くの文献やサイトで解説してくださっていますが，情けないことに私の残念な頭では理解できませんでした．本稿は上式の変換ができる理屈について，何とか自分なりに考えたものの備忘録となっております．誤りがあればご指摘いただければ幸いです．

###歪対称行列について
　問題の式を考える前に，3×3の歪対称行列$\left\lbrack T \right\rbrack_{\times}$について考えます．まずベクトル$\mathbf{t},\mathbf{x}$の外積は次のようになります．

```math
\mathbf{t} \times \mathbf{x} = \begin{bmatrix}
t_{0} \\
t_{1} \\
t_{2} \\
\end{bmatrix} \times \begin{bmatrix}
x_{0} \\
x_{1} \\
x_{2} \\
\end{bmatrix} = \begin{bmatrix}
t_{1}x_{2} - t_{2}x_{1} \\
t_{2}x_{0} - t_{0}x_{2} \\
t_{0}x_{1} - t_{1}x_{0} \\
\end{bmatrix}
```

ベクトル外積は基礎的な計算ですが，非常に面倒くさい計算式でもあります．そこで，ベクトル$\mathbf{t}$の各成分を3×3の行列$\left\lbrack T \right\rbrack_{\times}$にうまいこと当てはめ，外積を行列$\left\lbrack T \right\rbrack_{\times}$とベクトル$\mathbf{x}$の単純な積で表現してみます．

```math
\mathbf{t} \times \mathbf{x} = \begin{bmatrix}
t_{1}x_{2} - t_{2}x_{1} \\
t_{2}x_{0} - t_{0}x_{2} \\
t_{0}x_{1} - t_{1}x_{0} \\
\end{bmatrix} = \begin{bmatrix}
0 & - t_{2} & t_{1} \\
t_{2} & 0 & - t_{0} \\
 - t_{1} & t_{0} & 0 \\
\end{bmatrix}\begin{bmatrix}
x_{0} \\
x_{1} \\
x_{2} \\
\end{bmatrix} = \left\lbrack T \right\rbrack_{\times}\mathbf{x}
```

```math
\left\lbrack T \right\rbrack_{\times} = \begin{bmatrix}
0 & - t_{2} & t_{1} \\
t_{2} & 0 & - t_{0} \\
 - t_{1} & t_{0} & 0 \\
\end{bmatrix}
```

上式の成分計算のように$\left\lbrack T \right\rbrack_{\times}$を適切に選択すると，ベクトル外積$\mathbf{t} \times \mathbf{x}$と，行列とベクトルの積$\left\lbrack T \right\rbrack_{\times}\mathbf{x}$は等価となることがわかります．また，このとき$\left\lbrack T \right\rbrack_{\times}$は歪対称，すなわち$\left\lbrack T \right\rbrack_{\times} = {- \left\lbrack T \right\rbrack_{\times}}^{\top}$となります．

###3×3の歪対称行列の固有値
　本稿での$\left\lbrack T \right\rbrack_{\times}$の意味をはっきりさせたところで，$\left\lbrack T \right\rbrack_{\times}$の固有値について考えます．行列の固有値を求める方法で最もシンプルなものは次式であるかと思います．

```math
\det\left( \left\lbrack T \right\rbrack_{\times} - \lambda I \right) = 0
```

```math
\det\left( \begin{bmatrix}
0 & - t_{2} & t_{1} \\
t_{2} & 0 & - t_{0} \\
 - t_{1} & t_{0} & 0 \\
\end{bmatrix} - \begin{bmatrix}
\lambda & 0 & 0 \\
0 & \lambda & 0 \\
0 & 0 & \lambda \\
\end{bmatrix} \right) = 0
```

```math
\left| \begin{matrix}
\lambda & t_{2} & - t_{1} \\
 - t_{2} & \lambda & t_{0} \\
t_{1} & - t_{0} & \lambda \\
\end{matrix} \right| = 0
```
(計算を楽にするために符号を入れ替えました)

幸い，$\left\lbrack T \right\rbrack_{\times}$は3×3の行列ですので，力技で固有値を計算できそうです．上式にサラスの公式を使います．

```math
\left| \begin{matrix}
\lambda & t_{2} & - t_{1} \\
 - t_{2} & \lambda & t_{0} \\
t_{1} & - t_{0} & \lambda \\
\end{matrix} \right| = \lambda^{3} + t_{0}t_{1}t_{2} - t_{0}t_{1}t_{2} - \left( - \lambda{t_{0}}^{2} - \lambda{t_{1}}^{2} - \lambda{t_{2}}^{2} \right) = 0
```

$$\lambda\left( \lambda^{2} + {t_{0}}^{2} + {t_{1}}^{2} + {t_{2}}^{2} \right) = 0$$

```math
\therefore\lambda = 0,\  \pm i\left\| \mathbf{t} \right\|\text{  }\left( \left\| \mathbf{t} \right\| = \sqrt{{t_{0}}^{2} + {t_{1}}^{2} + {t_{2}}^{2}} \right)
```

$\left\lbrack T \right\rbrack_{\times}$の固有値は非常にシンプルなものとなりました．歪対称行列の固有値は実部が0という性質も満たしています．

###3×3の歪対称行列の特異値分解

　$\left\lbrack T \right\rbrack_{\times}$を特異値分解していきます．$\ \left\lbrack T \right\rbrack_{\times} = \left\lbrack V \right\rbrack\left\lbrack \Sigma \right\rbrack\left\lbrack U \right\rbrack^{\top}$とすると，次式が成り立ちます．

```math
\left\lbrack T \right\rbrack_{\times} = \left\lbrack V \right\rbrack\left\lbrack \Sigma \right\rbrack\left\lbrack U \right\rbrack^{\top}
```
```math
{{\left\lbrack T \right\rbrack_{\times}}^{\top}\left\lbrack T \right\rbrack}_{\times} = \left( \left\lbrack V \right\rbrack\left\lbrack \Sigma \right\rbrack\left\lbrack U \right\rbrack^{\top} \right)^{\top}\left\lbrack V \right\rbrack\left\lbrack \Sigma \right\rbrack\left\lbrack U \right\rbrack^{\top}
```
```math
{{\left\lbrack T \right\rbrack_{\times}}^{\top}\left\lbrack T \right\rbrack}_{\times} = \left\lbrack U \right\rbrack\left\lbrack \Sigma \right\rbrack^{\top}\left\lbrack V \right\rbrack^{\top}\left\lbrack V \right\rbrack\left\lbrack \Sigma \right\rbrack\left\lbrack U \right\rbrack^{\top}
```
```math
{{\left\lbrack T \right\rbrack_{\times}}^{\top}\left\lbrack T \right\rbrack}_{\times} = \left\lbrack U \right\rbrack\begin{bmatrix}
{\sigma_{0}}^{2} & 0 & 0 \\
0 & {\sigma_{1}}^{2} & 0 \\
0 & 0 & {\sigma_{2}}^{2} \\
\end{bmatrix}\left\lbrack U \right\rbrack^{\top}
```
```math
{{\left\lbrack T \right\rbrack_{\times}}^{\top}\left\lbrack T \right\rbrack}_{\times}\left\lbrack U \right\rbrack = \left\lbrack U \right\rbrack\text{diag}\left( {\sigma_{0}}^{2},{\sigma_{1}}^{2},{\sigma_{2}}^{2} \right)
```
```math
{{\left\lbrack T \right\rbrack_{\times}}^{\top}\left\lbrack T \right\rbrack}_{\times}\mathbf{u}_{j} = {\sigma_{j}}^{2}\mathbf{u}_{j}\text{  }\left( j = 0,1,2 \right)
```
```math
- \left\lbrack T \right\rbrack_{\times}\left\lbrack T \right\rbrack_{\times}\mathbf{u}_{j} = {\sigma_{j}}^{2}\mathbf{u}_{j}
```
```math
\left\lbrack T \right\rbrack_{\times}\left\lbrack T \right\rbrack_{\times}\mathbf{u}_{j} = \lambda'\mathbf{u}_{j}\text{   }\left( \lambda^{'} = - {\sigma_{j}}^{2} \right)
```

上式から，$\left\lbrack U \right\rbrack$は$\left\lbrack T \right\rbrack_{\times}\left\lbrack T \right\rbrack_{\times}$の固有ベクトルを集めた行列であることがわかります．また，$\left\lbrack T \right\rbrack_{\times}\left\lbrack T \right\rbrack_{\times}$の固有値が$\lambda'$，$\left\lbrack T \right\rbrack_{\times}$の固有値が$\lambda$であるとき次式が成り立ちます．

$$\lambda^{2} = \lambda^{'}\ \left( = - {\sigma_{j}}^{2} \right)$$

したがって，先ほど求めた固有値から次式がわかります．

```math
{\lambda^{'}}_{0} = - \left\| \mathbf{t} \right\|^{2},\ {\lambda^{'}}_{1} = - \left\| \mathbf{t} \right\|^{2},{\lambda^{'}}_{2} = 0
```
```math
\sigma_{0} = \left\| \mathbf{t} \right\|,\sigma_{1} = \left\| \mathbf{t} \right\|,\sigma_{2} = 0
```

固有値$\lambda^{'}$がすべてわかりました．次に固有ベクトル$\bf u_{j}$を求めていきます．ここで添え字がたくさんあると面倒なので，$\ \left( \bf u_{0},\bf u_{1},\bf u_{2} \right)=\left(\bf u,v,w \right)$とさせてください．まずは${\lambda^{'}}_{2} = 0$のときの固有ベクトル$\mathbf{w}$を考えていきます．

```math
\left\lbrack T \right\rbrack_{\times}\left\lbrack T \right\rbrack_{\times}\mathbf{w} = {\lambda^{'}}_{2}\mathbf{w}
```

```math
{\left\lbrack T \right\rbrack_{\times}\left\lbrack T \right\rbrack}_{\times}\mathbf{w} = \mathbf{0}
```

```math
\begin{bmatrix}
 - {t_{1}}^{2} - {t_{2}}^{2} & t_{0}t_{1} & t_{0}t_{2} \\
t_{0}t_{1} & - {t_{0}}^{2} - {t_{2}}^{2} & t_{1}t_{2} \\
t_{0}t_{2} & t_{1}t_{2} & - {t_{0}}^{2} - {t_{1}}^{2} \\
\end{bmatrix}\begin{bmatrix}
w_{0} \\
w_{1} \\
w_{2} \\
\end{bmatrix} = \mathbf{0}
```
```math
\left\{ \begin{matrix}
t_{0}t_{1}w_{1} + t_{0}t_{2}w_{2} = \left( {t_{1}}^{2} + {t_{2}}^{2} \right)w_{0} \\
t_{0}t_{1}w_{0} + t_{1}t_{2}w_{2} = \left( {t_{0}}^{2} + {t_{2}}^{2} \right)w_{1} \\
t_{0}t_{2}w_{0} + t_{1}t_{2}w_{1} = \left( {t_{0}}^{2} + {t_{1}}^{2} \right)w_{2} \\
\end{matrix} \right.\ 
```
```math
\therefore\mathbf{w} = \frac{1}{\left\| \mathbf{t} \right\|}\begin{bmatrix}
t_{0} \\
t_{1} \\
t_{2} \\
\end{bmatrix} = \frac{\mathbf{t}}{\left\| \mathbf{t} \right\|}\
```

本来であれば，${\lambda^{'}}_{0}, {\lambda^{'}}\_{1}$の場合を考えて，残りの固有ベクトルを出したいところですが，今回の場合は固有値$ {\lambda^{'}}\_{2} $の固有ベクトル$\mathbf{w}$がわかれば十分です．$\left\lbrack U \right\rbrack$が直交行列であることに注目すると，固有ベクトル$\mathbf{u},\mathbf{v},\mathbf{w}$は次の図のような関係にあります．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534476/f14905f4-cb46-efd3-92cd-ef05c4be8eb1.png)

ただし，上図は右手系としています．上図に基づいて，固有ベクトル$\mathbf{u},\mathbf{v},\mathbf{w}$の外積を考えると次のようになります．

```math
\mathbf{w} \times \mathbf{u} = \mathbf{v}
\\
\mathbf{t} \times \mathbf{u} = \left\| \mathbf{t} \right\|\mathbf{v}
\\
\left\lbrack T \right\rbrack_{\times}\mathbf{u} = \left\| \mathbf{t} \right\|\mathbf{v}
\\
```
```math
\mathbf{w} \times \mathbf{v} = \mathbf{- u}
\\
\mathbf{t} \times \mathbf{v} = \mathbf{-}\left\| \mathbf{t} \right\|\mathbf{u}
\\
\left\lbrack T \right\rbrack_{\times}\mathbf{v} = \mathbf{-}\left\| \mathbf{t} \right\|\mathbf{u}
\\
```
```math
\mathbf{w} \times \mathbf{w} = \mathbf{0}
\\
\left\lbrack T \right\rbrack_{\times}\mathbf{w} = \mathbf{0}
```

したがって，次式が成り立ちます．

```math
\left\lbrack T \right\rbrack_{\times}\begin{bmatrix}
\mathbf{u} & \mathbf{v} & \mathbf{w} \\
\end{bmatrix} = \begin{bmatrix}
\left\| \mathbf{t} \right\|\mathbf{v} & \mathbf{-}\left\| \mathbf{t} \right\|\mathbf{u} & 0 \\
\end{bmatrix}
```
```math
\left\lbrack T \right\rbrack_{\times}\begin{bmatrix}
\mathbf{u} & \mathbf{v} & \mathbf{w} \\
\end{bmatrix} = \begin{bmatrix}
\mathbf{v} & \mathbf{- u} & \mathbf{w} \\
\end{bmatrix}\text{diag}\left( \left\| \mathbf{t} \right\|,\left\| \mathbf{t} \right\|,0 \right)
```
```math
\left\lbrack T \right\rbrack_{\times} = \begin{bmatrix}
\mathbf{v} & \mathbf{- u} & \mathbf{w} \\
\end{bmatrix}\text{diag}\left( \left\| \mathbf{t} \right\|,\left\| \mathbf{t} \right\|,0 \right)\begin{bmatrix}
\mathbf{u} & \mathbf{v} & \mathbf{w} \\
\end{bmatrix}^{\top}
```

これで件の式が得られました．ここまでくれば十分ですが，一応最後までかかせてください．先述した$\sigma_{j}$の値から$\text{diag}\left( \left\| \mathbf{t} \right\|,\left\| \mathbf{t} \right\|,0 \right) = \left\lbrack \Sigma \right\rbrack$であることがわかります．さらに，$\ \begin{bmatrix}
\mathbf{v} & \mathbf{- u} & \mathbf{w} \\
\end{bmatrix} = \left\lbrack V \right\rbrack$と置くと次式が得られます．

```math
\left\lbrack T \right\rbrack_{\times} = \left\lbrack V \right\rbrack\left\lbrack \Sigma \right\rbrack\left\lbrack U \right\rbrack^{\top} = \begin{bmatrix}
\mathbf{v} & \mathbf{- u} & \mathbf{w} \\
\end{bmatrix}\text{diag}\left( \left\| \mathbf{t} \right\|,\left\| \mathbf{t} \right\|,0 \right)\begin{bmatrix}
\mathbf{u} & \mathbf{v} & \mathbf{w} \\
\end{bmatrix}^{\top}
```

以上で，$\left\lbrack T \right\rbrack_{\times}$の特異値分解は冒頭の式の形のなることを証明できました．

###参考サイト
(https://spherical-harmonics.hatenablog.com/entry/20101014/1287120547)
本稿の式について，より綺麗に証明されています．線形代数などをしっかり勉強されている方はこちらの方がわかりやすいかと思います．

(http://www.cfme.chiba-u.jp/~haneishi/class/iyogazokougaku/SVD.pdf)
SVD分解の解法についてはこちらのスライドで分かりやすく解説されています．