Main Content

行优先和列优先数组布局

数组的元素可以存储在列优先布局或行优先布局中。对于存储在列优先布局中的数组,列的元素在内存中是连续的。在行优先布局中,行的元素是连续的。数组布局也称为顺序、格式和表示。元素的存储顺序对于集成、可用性和性能非常重要。某些算法对以特定顺序存储的数据的执行效率更高。

编程语言和环境通常为所有数据假设单一的数组布局。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 的行优先布局相匹配。(对于复数,数组布局转换使用非共轭转置。)

另请参阅

| | |

相关主题