行優先および列優先の配列レイアウト
配列の要素は列優先のレイアウトまたは行優先のレイアウトで格納することができます。列優先のレイアウトで格納される配列の場合、列の要素はメモリ内で連続しています。行優先のレイアウトでは、行の要素が連続しています。配列レイアウトは、順番、形式、表現とも呼ばれます。要素を格納する順番は、統合、有用性、およびパフォーマンスにとって重要であることがあります。特定の順番で格納されたデータ上でパフォーマンスが向上するアルゴリズムもあります。
プログラミング言語および環境は、通常、すべてのデータに対して単一の配列レイアウトを想定します。MATLAB® と Fortran は、既定で列優先のレイアウトを使用しますが、C と C++ は行優先のレイアウトを使用します。MATLAB Coder™ では、行優先のレイアウトまたは列優先のレイアウトを使用する C/C++ コードを生成できます。行優先の配列レイアウトを使用するコードの生成を参照してください。
コンピューター メモリへの配列の格納
コンピューター メモリは、データを 1 次元配列として格納します。たとえば、3 行 3 列の行列を宣言した場合、この行列はソフトウェアによって 9 つの要素をもつ 1 次元配列として格納されます。既定の設定では、MATLAB はこれらの要素を列優先の配列レイアウトで格納します。メモリ内で、各列の要素が連続します。
行列 A
を考えます。
A = 1 2 3 4 5 6 7 8 9
既定では、行列 A
は、メモリでは以下の配列で表現されます。
1 4 7 2 5 8 3 6 9
行優先の配列レイアウトでは、プログラミング言語は、行要素がメモリ内で連続するよう格納します。行優先のレイアウトでは、配列の要素は次のように格納されます。
1 2 3 4 5 6 7 8 9
N 次元の配列も、列優先または行優先のレイアウトで格納できます。列優先のレイアウトでは、最初 (左端) の次元またはインデックスの要素がメモリ内で連続します。行優先では、最後 (右端) の次元またはインデックスの要素が連続します。
異なる配列レイアウト間の変換
同じコード内で行優先のデータと列優先のデータが混在する場合、配列レイアウト変換が必要になります。たとえば、行優先および列優先の関数の特殊化を含むコードを生成することができます。関数の特殊化では、すべての入力データ、出力データ、および内部データで 1 種類の配列レイアウトを使用します。関数の間でデータを受け渡すとき、コード ジェネレーターが、必要に応じて、自動的に配列レイアウト変換を挿入します。生成された MEX 関数への入力データと出力データも、必要に応じて変換されます。
2 次元のデータの場合、転置演算が行優先のレイアウトと列優先のレイアウトとの間でデータを変換します。A
の転置されたバージョンを考えます。
A' = 1 4 7 2 5 8 3 6 9
A'
の列優先のレイアウトは、A
の行優先のレイアウトと一致します (複素数の場合、配列レイアウト変換には、非共役転置が使用されます)。
参考
coder.columnMajor
| coder.rowMajor
| coder.isRowMajor
| coder.isColumnMajor