行列の行優先と列優先についての説明

行列の要素の格納形式である行優先(Row-major)と列優先(Column-major)について、3Dグラフィックスで使用する観点から概要を説明します。

行優先と列優先の違い

行優先と列優先の違いは、要素の格納順序を行方向から並べるか列方向から並べるかの違いです。 どちらを採用するかによって、行列の要素の扱いやベクトルとの掛け合わせの順番が変わります。

行列の要素の配置

ここでは4x4行列を次のように表現します:

(M11M12M13M14M21M22M23M24M31M32M33M34M41M42M43M44)\begin{pmatrix} M_{11} & M_{12} & M_{13} & M_{14} \\ M_{21} & M_{22} & M_{23} & M_{24} \\ M_{31} & M_{32} & M_{33} & M_{34} \\ M_{41} & M_{42} & M_{43} & M_{44} \\ \end{pmatrix}

行優先と列優先どちらでも行と列の意味は変わりません。値を格納する順番が変わります。

それぞれに 1~16 の値を格納すると次のような関係になります:

列優先: (15913261014371115481216)\begin{pmatrix} 1 & 5 & 9 & 13 \\ 2 & 6 & 10 & 14 \\ 3 & 7 & 11 & 15 \\ 4 & 8 & 12 & 16 \\ \end{pmatrix}

行優先: (12345678910111213141516)\begin{pmatrix} 1 & 2 & 3 & 4 \\ 5 & 6 & 7 & 8 \\ 9 & 10 & 11 & 12 \\ 13 & 14 & 15 & 16 \\ \end{pmatrix}

相互に変換したい場合は行列を転置(transpose)します。 言い換えると、列優先行列と行優先行列は転置行列の関係にあります。

ベクトルの種類

次の組み合わせで使われることが一般的だと思います。

列優先であれば、列ベクトル:

(xyzw)\begin{pmatrix}x \\ y \\ z \\ w\end{pmatrix}

行優先であれば、行ベクトル:

(xyzw)\begin{pmatrix}x & y & z & w\end{pmatrix}

ベクトルと行列の積

3Dグラフィックスでは、ベクトル(頂点、法線など)を行列で変換して結果のベクトルを求めることが主な目的です。この場合のベクトルと行列の積は次のように行います。

列優先行列・列ベクトルであれば行列の右側からベクトルを掛けます:

(xyzw)=(M11M12M13M14M21M22M23M24M31M32M33M34M41M42M43M44)(xyzw)\begin{pmatrix}x' \\ y' \\ z' \\ w'\end{pmatrix} = \begin{pmatrix} M_{11} & M_{12} & M_{13} & M_{14} \\ M_{21} & M_{22} & M_{23} & M_{24} \\ M_{31} & M_{32} & M_{33} & M_{34} \\ M_{41} & M_{42} & M_{43} & M_{44} \\ \end{pmatrix} \begin{pmatrix}x \\ y \\ z \\ w\end{pmatrix}

行優先行列・行ベクトルであれば行列の左側からベクトルを掛けます:

(xyzw)=(xyzw)(M11M12M13M14M21M22M23M24M31M32M33M34M41M42M43M44)\begin{pmatrix}x' & y' & z' & w'\end{pmatrix} = \begin{pmatrix}x & y & z & w\end{pmatrix} \begin{pmatrix} M_{11} & M_{12} & M_{13} & M_{14} \\ M_{21} & M_{22} & M_{23} & M_{24} \\ M_{31} & M_{32} & M_{33} & M_{34} \\ M_{41} & M_{42} & M_{43} & M_{44} \\ \end{pmatrix}

行列とベクトルの積についての、もう少し詳しい説明は「行列とベクトルの積・行列と行列の積の説明」に書いています。