行优先和列优先数组布局
数组的元素可以存储在列优先布局或行优先布局中。对于存储在列优先布局中的数组,列的元素在内存中是连续的。在行优先布局中,行的元素是连续的。数组布局也称为顺序、格式和表示。元素的存储顺序对于集成、可用性和性能非常重要。某些算法对以特定顺序存储的数据的执行效率更高。
编程语言和环境通常为所有数据假设单一的数组布局。MATLAB® 和 Fortran 默认使用列优先布局,而 C 和 C++ 使用行优先布局。使用 MATLAB Coder™,您可以生成使用行优先布局或列优先布局的 C/C++ 代码。请参阅Generate Code That Uses Row-Major Array Layout。
计算机内存中的数组存储
计算机内存以一维数组的形式存储数据。例如,当您声明 3×3 矩阵时,软件会将此矩阵存储为包含九个元素的一维数组。默认情况下,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 维数组也可以存储在列优先布局或行优先布局中。在列优先布局中,第一个(最左边)维度或索引的元素在内存中是连续的。在行优先布局中,最后一个(最右边)维度或索引的元素是连续的。
不同数组布局之间的转换
当您在同一代码中混合行优先数据和列优先数据时,需要进行数组布局转换。例如,您可以生成包含行优先和列优先函数特化的代码。函数特化对所有输入、输出和内部数据使用一种类型的数组布局。在函数之间传递数据时,代码生成器会根据需要自动插入数组布局转换。生成的 MEX 函数的输入和输出数据也根据需要进行转换。
对于二维数据,转置运算在行优先布局和列优先布局之间转换数据。以 A
的如下转置版本为例:
A' = 1 4 7 2 5 8 3 6 9
A'
的列优先布局与 A
的行优先布局相匹配。(对于复数,数组布局转换使用非共轭转置。)
另请参阅
coder.columnMajor
| coder.rowMajor
| coder.isRowMajor
| coder.isColumnMajor