anchor.diff:  \vec{P'}=P_0a\vec{X}+P_1b\vec{Y}+P_2c\vec{Z}+\vec{T}
   ++++
   
  -これはベクトル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:[\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: 
  === 付録その一 
  
  残った仕事はまた一つあります。この方法は仮定なしでも成立するのを証明することです。先ずは何を仮定したのかを振り返ってみよう：
  
  [stem]
  ++++
  
negative.code: 
  https://lxjk.github.io/2017/09/03/Fast-4x4-Matrix-Inverse-with-SSE-SIMD-Explained.html[English Verison]
  
  始まる前に、実際に必要となる逆行列は「一般の行列」かどうかを考えてください。
  
  私は自作ゲームエンジンの数学系ライブラリを書く時、逆行列の問題を考えました。ゲームや３Dアプリケーションでは、オブジェクトのトランスフォーム情報は４ｘ４行列で記録されています。このような、位置、回転、スケールの三要素から作成している行列は、この文章で「トランスフォーム行列」と呼びます。トランスフォーム行列は一般の行列より2倍早い逆行列の求め方があります。この文章の前半は先ずトランスフォーム行列について話しましょう。後半はSIMD命令を用いた一般の４ｘ４行列の逆行列の求め方を説明します。最後にこのアルゴリズムのパフォーマンスとよく使われる数学系ライブラリUE4、Eigen、DirectX Mathなどを比較させていただきます。
  
  この文章の行列は全て行優先になります。データレイアウトの説明は行優先の方が簡単であり、他の数学系ライブラリとの参照も出来ます。逆行列の求め方について、行優先と列優先は同じです（stem:[A^{-1}=((A^{T})^{-1})^{T}] のため）。私と同じく列優先が好みだとしたら、付録に列優先バージョンのソースコードも用意しています。
  
  