変換行列

線形代数において、線形変換は行列で表すことができる。Tが\mathbb{R}^nから\mathbb{R}^mへの写像を行う線形変換であり、\mathbf xがn個の要素を持つ列ベクトルであるとき、以下の式のようなm \times nの行列Aが存在し、Tの**変換行列**（へんかんぎょうれつ、Transformation matrix）と呼ばれる。
T( \mathbf x ) = A \mathbf x
Aはm行とn列を持つのに対し、変換行列Tは\mathbb{R}^nから\mathbb{R}^mへの変換であることに注意。行ベクトルを対象とする変換行列の表現もあり、この表記を好む者もいる。

## 使用
行列を用いることで、任意の線形変換を計算に適した一貫した形式で表示することができる。これにより、変換を（行列の乗算により）容易に合成することもできる。

行列によって表現することができるのは線形変換だけではない。n次元のユークリッド空間**R***n*における非線形な変換の一部は、(n+1)次元空間**R***n*+1における線形変換として表現することができる。これにはアフィン変換（平行移動など）及び射影変換が含まれる。そのため、4×4の変換行列は3次元コンピュータグラフィックスで広く用いられている。この(n+1)次元の変換行列は用途に応じて「アフィン変換行列」、「射影変換行列」またはより一般的に「非線形変換行列」と呼ばれる。n次元の行列に関して、(n+1)次元の行列は拡大行列と説明することができる。

物理科学において、能動変換(:en:active transformation)は、系の物理的な位置を実際に変化させる変換であり、座標系が存在しない場合にも意味を持つ。一方で、受動変換(:en:passive transformation)は、物理系の座標記述における変化（基底変換）である。能動変換と受動変換との区別は重要である。数学者は通常「変換」という場合にはそれは能動変換を指すが、物理学者の場合はどちらも指す場合がある。

言い換えると、「受動的な」変換は同じ物体を2つの異なる座標系から見た場合の記述である。

## 変換行列の見つけ方
線形変換T(x)が関数形式で与えられている場合、標準基底の各ベクトルを*T*で変換し、その結果を行列の列に挿入することで変換行列*T*を簡単に決定することができる。言い換えると以下のように表すことができる。
A = \begin{bmatrix} T( \mathbf e_1 ) & T( \mathbf e_2 ) & \cdots & T( \mathbf e_n ) \end{bmatrix}

例えば、関数 T(x) = 5x は線形変換である。上記の過程を適用すると（*n* = 2とする）、次のようになる。
T( \mathbf{x} ) = 5 \mathbf{x} = 5I\mathbf{x} = \begin{bmatrix} 5 & 0 \\ 0 & 5 \end{bmatrix} \mathbf{x}

ベクトルと作用素の行列表現は選択した基底により異なる。基底を変えても相似した行列が得られる。ただし、成分を求める方法は変わらない。

詳しく言うと、ベクトル\mathbf vは、基底ベクトル E = \begin{bmatrix}\mathbf e_1 & \mathbf e_2 & \cdots & \mathbf e_n\end{bmatrix} において、座標  [\mathbf v]_E = \begin{bmatrix} v_1 & v_2 & \cdots & v_n \end{bmatrix}^\mathrm{T} によって以下のように表現することができる。
\mathbf v = v_1 \mathbf e_1 + v_2 \mathbf e_2 + \cdots + v_n \mathbf e_n = \sum_i v_i \mathbf e_i = E [\mathbf v]_E

ここで、与えられた基底における\mathbf vへの変換行列*A*の結果を次のように表す。
\begin{align}
  A(\mathbf v)
    &= A \left(\sum_i v_i \mathbf e_i \right)
     = \sum_i {v_i A(\mathbf e_i)} \\
    &= \begin{bmatrix}A(\mathbf e_1) & A(\mathbf e_2) & \cdots & A(\mathbf e_n)\end{bmatrix} [\mathbf v]_E
     = A \cdot [\mathbf v]_E \\[3pt]
    &= \begin{bmatrix}\mathbf e_1 & \mathbf e_2 & \cdots & \mathbf e_n \end{bmatrix}
       \begin{bmatrix}
         a_{1,1} & a_{1,2} & \cdots & a_{1,n} \\
         a_{2,1} & a_{2,2} & \cdots & a_{2,n} \\
          \vdots &  \vdots & \ddots &  \vdots \\
         a_{n,1} & a_{n,2} & \cdots & a_{n,n} \\
       \end{bmatrix}
       \begin{bmatrix} v_1 \\ v_2 \\ \vdots \\ v_n\end{bmatrix} 
\end{align}

行列*A*の要素a_{i,j}は、与えられた基底*E*に対して*A*を全ての\mathbf e_j = \begin{bmatrix} 0 & 0 & \cdots & (v_j=1) & \cdots & 0 \end{bmatrix}^\mathrm{T}に適用し、応答ベクトルを観察することで決定される。
A \mathbf e_j = a_{1,j} \mathbf e_1 + a_{2,j} \mathbf e_2 + \cdots + a_{n,j} \mathbf e_n = \sum_i a_{i,j} \mathbf e_i

この式は行列*A*のj番目の列の要素であるa_{i,j}を定義する。

### 固有基底と対角行列

成分が対角行列を形成し、その結果として乗算の計算量が  に減少するような作用素には特別な基底がある。対角行列とは、係数 a_{i,j}  のうち a_{i,i} 以外が全てゼロであり、上記の和\sum a_{i,j} \mathbf e_iにおいて1つの項しか残らないことを意味する。残った対角要素 a_{i,i} は**固有値**として知られており、簡約化された定義式A \mathbf e_i = \lambda_i \mathbf e_iにおいて\lambda_iと表される。この式は**固有値方程式**として知られる。固有ベクトルと固有値は、**特性多項式**を介して導出される。

対角化により、固有基底との相互変換がしばしば可能となる。

## 2次元における例
原点を固定したほとんどの一般的な幾何学的変換は線形であり、回転、拡大縮小、せん断、鏡映、正射影などが含まれる。アフィン変換が純粋な平行移動でない場合は不動な点が存在し、その点を原点と選択することで変換を線形化することができる。2次元では、線形変換は2×2の変換行列を用いて表すことができる。

### 伸張
xy平面における伸張(stretch)は、特定の方向への距離を定数倍して拡大し、その垂直方向には影響を与えない線形変換である。ここではx軸とy軸に沿った伸縮のみを考慮する。x軸に沿った伸張は、ある正の定数kに対して; という形をとる（の場合、実際に「伸張」であるがは厳密には「圧縮」である。しかしこの場合も同様に伸張と呼ぶ。また、の場合、この変換は恒等変換、つまり何の影響も与えない）。

x軸に沿って係数kにより引き伸ばす行列は次のように与えられる。
\begin{bmatrix} k &  0 \\ 0 & 1 \end{bmatrix} 

同様に、y軸に沿って係数kにより引き伸ばすと ; という形になるため、この変換に関連する行列は次のようになる。
\begin{bmatrix} 1 &  0 \\ 0 & k \end{bmatrix} 

### 圧搾
上記伸長を2つ逆数値で組み合わせると、変換行列はを表す。
\begin{bmatrix} k &  0 \\ 0 & 1/k \end{bmatrix} .
軸に平行な辺を持つ正方形は、正方形と同じ面積を持つ長方形に変換される。二軸が相互に伸縮しても面積は変化しない。

### 回転
原点周りに**反時計回り**（正方向）に角度θだけ回転する場合の関数形式は x' = x \cos \theta - y \sin \thetaとy' =  x \sin \theta + y \cos \thetaである。行列の形で書くと、以下のようになる。
\begin{bmatrix} x' \\ y' \end{bmatrix} = \begin{bmatrix} \cos \theta & -\sin\theta \\ \sin \theta & \cos \theta \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix}

同様に、原点周りに**時計回り**（負方向）する場合の関数形式はx' = x \cos \theta + y \sin \thetaとy' = -x \sin \theta + y \cos \thetaである。行列の形は以下のようになる。
\begin{bmatrix} x' \\ y' \end{bmatrix} = \begin{bmatrix} \cos \theta &   \sin\theta \\ -\sin \theta & \cos \theta \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix}

これらの式は、x軸が右向き、y軸が上向きであることを前提としている。

### せん断
せん断写像（視覚的には傾斜に似る）の場合、2つの行列が考えられる。

x軸に平行なせん断は、x' = x + kyとy' = yという関数形式をとり、行列の形では以下のように書ける。
\begin{bmatrix} x' \\ y' \end{bmatrix} = \begin{bmatrix} 1 & k \\ 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix}

y軸に平行なせん断は、x' = xとy' = y + kxという関数形式をとり、行列の形では以下のように書ける。

\begin{bmatrix} x' \\ y' \end{bmatrix} = \begin{bmatrix} 1 & 0 \\ k & 1 \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix}


### 鏡映

原点を通る直線の鏡映では、直線方向のベクトルを\mathbf{l} = (l_x, l_y)とすると、変換行列は以下のようになる。
\mathbf{A} = \frac{1}{\lVert\mathbf{l}\rVert^2} \begin{bmatrix} l_x^2 - l_y^2 & 2 l_x l_y \\ 2 l_x l_y & l_y^2 - l_x^2 \end{bmatrix}

### 正射影

ベクトルを原点を通る直線に正射影するには、直線方向のベクトルを\mathbf{u} = (u_x, u_y)とすると、変換行列は次のようになる。
\mathbf{A} = \frac{1}{\lVert\mathbf{u}\rVert^2} \begin{bmatrix} u_x^2 & u_x u_y \\ u_x u_y & u_y^2 \end{bmatrix}

鏡映と同様に、原点を通らない直線への正射影は線形変換ではなくアフィン変換である。

平行射影も線形変換であり、単純に行列で表すことができる。しかし、透視投影は線形変換ではなく、行列で表すにはを使用することができる。

## 3次元コンピュータグラフィックスにおける使用

### 回転
単位ベクトル(*x*,*y*,*z*)により定義される任意の軸周りの角度θの回転行列は以下で与えられる。
\begin{bmatrix}
xx(1-\cos \theta)+\cos\theta & yx(1-\cos\theta)-z\sin\theta & zx(1-\cos\theta)+y\sin\theta\\
xy(1-\cos\theta)+z\sin\theta & yy(1-\cos\theta)+\cos\theta & zy(1-\cos\theta)-x\sin\theta \\
xz(1-\cos\theta)-y\sin\theta & yz(1-\cos\theta)+x\sin\theta & zz(1-\cos\theta)+\cos\theta
\end{bmatrix}

### 鏡映

ある点を平面ax + by + cz = 0（原点を通る）に関して鏡映させるために、\mathbf{A} = \mathbf{I} - 2\mathbf{NN}^\mathrm{T} を用いることができる。ここで\mathbf{I}は3×3の単位行列で\mathbf{N}は平面の法線ベクトルとなる3次元単位ベクトルである。a, b, cの*L*2ノルムが1の場合、変換行列は次のように表すことができる
\mathbf{A} = \begin{bmatrix} 1 - 2 a^2  & - 2 a b & - 2 a c \\ - 2 a b  & 1 - 2 b^2 & - 2 b c  \\ - 2 a c & - 2 b c & 1 - 2c^2 \end{bmatrix}

これらは2次元及び3次元におけるハウスホルダー鏡映の特殊なケースである。原点を通らない直線又は平面に関する鏡映は線形変換ではなく、アフィン変換である。4×4のアフィン変換行列は次のように表すことができる（法線が単位ベクトルであると仮定）。
\begin{bmatrix} x' \\ y' \\ z' \\ 1 \end{bmatrix} = \begin{bmatrix} 1 - 2 a^2  & - 2 a b & - 2 a c & - 2 a d \\ - 2 a b  & 1 - 2 b^2 & - 2 b c & - 2 b d \\ - 2 a c & - 2 b c & 1 - 2c^2 & - 2 c d \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} 
ここでdは、平面上のある点\mathbf{p}に対してd = -\mathbf{p} \cdot \mathbf{N}、または等価な式ax + by + cz + d = 0を満たす。

ベクトルの4番目の成分が1ではなく0である場合、ベクトルの方向のみが鏡映され大きさは変化しない。これは、元の鏡映面と平行で原点を通る平面によって鏡映されたかのように見える。このことは位置ベクトルと法線ベクトルの両方を同じ行列で変換することができる点で便利な性質である。後段のアフィン変換も参照のこと。

## 変換の合成と逆変換
線形変換を表現するために行列を用いる主な理由の1つは、変換の合成や逆変換が容易になることである。

合成は行列の乗算により行われる。

**A**と**B**が2つの線形変換の行列であり、列ベクトル\mathbf{x}に最初に**A**を適用しその後**B**を適用することは以下の式で与えられる。
\mathbf{B}(\mathbf{A} \mathbf x) = (\mathbf{BA}) \mathbf x.

言い換えると、変換**A**と変換**B**を続けて行う変換の行列は、単に各々の行列の積である。

**A**が可逆行列であるとき、**A**との合成が単位行列になり**A**を「元に戻す」変換を表す行列**A**−1が存在する。実用的な応用の中には、一般的な逆行列アルゴリズムを用いたり、逆演算（逆方向への回転など幾何学的な解釈が明らかなもの）を実行することで逆行列を計算する方法がある。変換が複数の合成である場合は、逆行列を逆順に合成する必要がある。鏡映行列はそれ自体の逆行列であるため、別途計算する必要がない。

## 他の種類の変換
### アフィン変換

アフィン変換を行列で表すにはを使用することができる。これは、2次元ベクトル (*x*, *y*) を3次元ベクトル (*x*, *y*, 1)として表すことを意味し、より高次元の場合も同様である。これにより並進を行列の乗算で表すことができる。関数形式はx' = x + t_x; y' = y + t_yであり、行列は以下のように表される。
\begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}

通常の線形変換は全てアフィン変換の集合に含まれており、アフィン変換の簡略化された形式として記述できる。したがって、任意の線形変換は一般化された変換行列によっても表すことができる。アフィン変換の変換行列は対応する線形変換行列を1行1列拡張して右下隅の要素を1に、他の要素を0にすることで得られる。例えば上記の**反時計回りの**回転行列は次のようになる。
\begin{bmatrix} \cos \theta & -\sin \theta & 0 \\ \sin \theta & \cos \theta & 0 \\ 0 & 0 & 1 \end{bmatrix}

同次座標を含む変換行列を用いると、平行移動は線形となり他のあらゆる種類の変換とシームレスに混在させることができる。これは、実平面が実射影空間の平面に写像されるため、実ユークリッド空間における平行移動は実射影空間におけるせん断として表すことができるためである。平行移動は直交座標で記述される2次元又は3次元ユークリッド空間では非線形変換である（つまり、可換性やその他の特性を維持しながら他の変換と組み合わせることはできない）が、同次座標で記述される3次元又は4次元射影空間では単純な線形変換（せん断）になる。

2つ以上のアフィン変換を合成することで、より多くのアフィン変換が得られる。例えば、ベクトル(t'_x, t'_y)の平行移動 **T**'、**反時計回り**の角度θの回転**R**、要素(s_x, s_y)の拡大縮小**S**、(t_x, t_y),の平行移動**T**が与えられるとき、それらを合成した**T'RST**の変換行列は以下のようになる。
\begin{bmatrix}
s_x \cos \theta & - s_y \sin \theta & t_x s_x \cos \theta - t_y s_y \sin \theta + t'_x \\
s_x  \sin \theta & s_y \cos \theta & t_x s_x \sin \theta + t_y s_y \cos \theta + t'_y \\
0      & 0 & 1
\end{bmatrix}

アフィン変換を用いると、座標ベクトルの同次成分（通常はwと呼ばれる）は変化しない。したがって、常に1であると仮定して無視しても問題ない。しかし、透視投影を用いる場合は異なる。

### 透視投影

3次元コンピュータグラフィックスにおいて重要なもう1つの変換は透視投影である。平行投影は点を平行線に沿って画像平面に投影するために使用されるが、透視投影は投影中心と呼ばれる単一の点から発せられる線に沿って画像平面に点を投影する。このことは物体が投影中心から遠いほど投影範囲が小さくなり、近いほど投影範囲が大きくなることを意味する。

最も単純な透視投影では、原点を投影の中心としてz = 1の平面を像平面とする。すると、この変換の関数形式はx' = x / z; y' = y / zとなる。これを同次座標で表すと次のようになる。
\begin{bmatrix} x_c \\ y_c \\ z_c \\ w_c \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 &  1 & 0 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix}=\begin{bmatrix} x \\ y \\ z \\ z \end{bmatrix}


行列の乗算を行うと、同次成分w_cはzの値と等しくなり、他の3つは変化しない。したがって、実平面に写像し直すには各成分をw_cにより割る**同次除算**(homogeneous divide)または**透視除算**(perspective divide)を実行する必要がある。
\begin{bmatrix} x' \\ y' \\ z' \\ 1 \end{bmatrix} = \frac{1}{w_c} \begin{bmatrix} x_c \\ y_c \\ z_c \\ w_c \end{bmatrix}=\begin{bmatrix} x / z \\ y / z \\ 1 \\ 1 \end{bmatrix}

これを回転、拡大縮小、平行移動およびせん断と組み合わせて像平面と投影中心を任意の場所に移動することで、より複雑な透視投影を作成できる。

## 出典

## 外部リンク
*  The Matrix Page Practical examples in POV-Ray
* Reference page - Rotation of axes
* Linear Transformation Calculator
* Transformation Applet - Generate matrices from 2D transformations and vice versa.
* Coordinate transformation under rotation in 2D
* Excel Fun - Build 3D graphics from a spreadsheet