anchor.diff:  M=\left( \begin{matrix} a\vec{X} & 0 \\ b\vec{Y} & 0 \\ c\vec{Z} & 0 \\ \vec{T} & 1 \\ \end{matrix} \right) = \left( \begin{matrix} aX_0 & aX_1 & aX_2 & 0 \\ bY_0 & bY_1 & bY_2 & 0 \\ cZ_0 & cZ_1 & cZ_2 & 0 \\ T_0 & T_1 & T_2 & 1 \\ \end{matrix} \right)
   ++++
   
  -最後の行の最初の3つの成分は位置stem:[\vec{T}]です。左上の３ｘ３小行列はスケール回転行列、その3行ともスケール変換した回転軸であります。つまりstem:[\vec{X}\cdot\vec{Y}=\vec{X}\cdot\vec{Z}=\vec{Y}\cdot\vec{Z}=0]、stem:[\left|\vec{X}\right|=\left|\vec{Y}\right|=\left|\vec{Z}\right|=1]、そしてスケールはstem:[(a,b,c)]です。 
  -
  -Most matrices in the game are of this form. For example, stem:[M] represents a local to world transform, stem:[\vec{X}], stem:[\vec{Y}], stem:[\vec{Z}] are your local space axes. If you have a point stem:[\vec{P}(P_0,P_1,P_2)], and you want to transform it from local space to world space, you do this:
  +第4行の最初の3つの成分は位置stem:[\vec{T}]です。左上の３ｘ３小行列はスケール回転行列、その3行ともスケール変換した回転軸であります。つまりstem:[\vec{X}\cdot\vec{Y}=\vec{X}\cdot\vec{Z}=\vec{Y}\cdot\vec{Z}=0]、stem:[\left|\vec{X}\right|=\left|\vec{Y}\right|=\left|\vec{Z}\right|=1]、そしてスケールはstem:[(a,b,c)]です。 
  +
  +ゲームに使う行列はほとんどこの形になります。例えば、stem:[M]はローカルからワールドへの座標変換、stem:[\vec{X}], stem:[\vec{Y}], stem:[\vec{Z}]はローカル座標の軸と考えます。ローカル空間内の位置stem:[\vec{P}(P_0,P_1,P_2)]をローカル座標からワールド座標へ変換する時、次の式を使います：
   
   [stem]
   ++++
   \vec{P'}=P_0a\vec{X}+P_1b\vec{Y}+P_2c\vec{Z}+\vec{T}
   ++++
   
  -This is the same as extend stem:[\vec{P}] to a 4 component vector stem:[\vec{P}(P_0,P_1,P_2,1)] and multiply by matrix stem:[M]. Now what does inverse matrix stem:[M^{-1}] mean? In this case it represents a world to local transform, so if we multiply stem:[\vec{P'}] by stem:[M^{-1}], we should get stem:[\vec{P}] back. How do we transform the point stem:[\vec{P'}] from world space back in local space? We subtract the local space origin (aka the translation stem:[\vec{T}]), then dot each axes to get its local space coordinate and rescale it:
  +これはベクトルstem:[\vec{P}]を拡張して、4元ベクトルstem:[\vec{P}(P_0,P_1,P_2,1)]と行列stem:[M]の積と同じです。なら逆行列stem:[M^{-1}]は何を意味するでしょうか？この例だと、ワールドからローカルへの座標変換です。つまり、拡張したワールド座標stem:[\vec{P'}]とstem:[M^{-1}]の積を求めれば、結果はローカル座標のstem:[\vec{P}]になるはずです。では行列なしでどうやってワールド空間の位置stem:[\vec{P'}]をワールド座標からローカル座標へ変換するでしょう？先ずローカル座標の原点（つまりstem:[\vec{T}]）を引き、そしてローカルの軸との内積を求め、最後に逆スケール変換します：
   
   [stem]
   ++++
  
positive.code: #define VecShuffle_2323(vec1, vec2)        _mm_movehl_ps(vec2, vec1)
  ----
  
  Here is our first function to inverse transform matrix without scaling (always unit scale).
  
  [source,cpp]
  ----
  
negative.code: 
  私は自作ゲームエンジンの数学系ライブラリを書く時、逆行列の問題を考えました。ゲームや３Dアプリケーションでは、オブジェクトのトランスフォーム情報は４ｘ４行列で記録されています。このような、位置、回転、スケールの三要素から作成している行列は、この文章で「トランスフォーム行列」と呼びます。トランスフォーム行列は一般の行列より2倍早い逆行列の求め方があります。この文章の前半は先ずトランスフォーム行列について話しましょう。後半はSIMD命令を用いた一般の４ｘ４行列の逆行列の求め方を説明します。最後はこのアルゴリズムのパフォーマンスとよく使われる数学系ライブラリUE4、Eigen、DirectX Mathなどと比較させていただきます。
  
  この文章の行列は全て行優先になります。データレイアウトの説明は行優先の方が簡単であり、他の数学系ライブラリとの参照も出来ます。逆行列の求め方について、行優先と列優先は同じです（stem:[A^{-1}=((A^{T})^{-1})^{T}] のため）。私と同じく列優先が好みだとしたら、付録に列優先バージョンのソースコードも用意しています。
  
  === トランスフォーム行列
  
  