主要内容

使用n维索引生成代码

默认情况下,代码生成器使用一维数组的索引。代码生成器创建一维数组在C / c++代码在MATLAB n维数组®代码。您可以使用n维索引来改善可读性和适应接口生成的代码。

此表显示了一个示例的差异在生成的代码中有或没有n维索引。

MATLAB代码

生成C代码(默认)

生成C代码启用了一天索引

一个= 0 (2、4、6)
一个[48]
  • 与列为主的阵列布局(默认):

    一个[6][4][2]
  • 启用了行阵列布局:

    一个[2][4][6]

对于n维索引,索引的顺序是倒过来的,因为MATLAB生成代码,使用列为主的数组默认布局。切换指标的顺序,您可以启用行阵列布局。

n维数组转换成一维也被称为数组压扁。在计算机内存中,所有数据都存储在一维数组。索引的选择不改变计算的结果。然而,如果您的代码输入或输出数组,该接口生成的代码可以改变。

使n维索引:

  • 使用-preservearraydims选择:

    codegen喷火-preservearraydims
  • 设置PreserveArrayDimensions你的代码生成配置对象属性真正的。例如:

    cfg = coder.config (“自由”);cfg。PreserveArrayDimensions = true;codegen喷火配置cfg

使n维索引的MATLAB编码器™应用:

  • 导航到生成代码页面的代码生成工作流。

  • 打开生成通过单击对话框生成箭头

  • 点击更多的设置

  • 内存选项卡中,选择保存数组维度复选框。

改善可读性与n维索引和行布局

n维索引可以方便你跟踪生成的C / c++代码回到你的MATLAB代码。代码生成器保留原始数组的尺寸,而不是将数组转换为一维。此外,您可以指定行布局,使外观更加直观的代码。

考虑到MATLAB函数addMatrices增加两个矩阵元素的元素:

函数和= addMatrices (A, B)% # codegen和= coder.nullcopy(一个);行= 1:尺寸(1)坳= 1:尺寸(2)和(行,坳)=(行,坳)+ B(行,坳);结束结束

生成的代码addMatrices所以它作用于2×4数组。使n维索引和存储阵列布局:

cfg = coder.config (“自由”);cfg。PreserveArrayDimensions = true;cfg。RowMajor = true;codegenaddMatricesarg游戏{的(2、4)的(2、4)}配置cfg-launchreport

代码生成生成代码与显式二维数组索引:

/ *天索引,行* /空白addMatrices(双[2][4],双B[2][4],双[2]和[4]){int行;int上校;连续(= 0;行< 2;行+ +){(col = 0;坳< 4;坳+ +){总和(行)(col) =(行)(col) + B(行)(col);}}}

生成的代码addMatrices使用相同的二维索引与原始MATLAB代码。你可以很容易地分析生成的代码与原算法相比。了解如何使用行布局,明白了生成代码,使用行阵列布局

列为主的布局和n维索引

选择阵列布局影响n维索引的外观。例如,生成的代码addMatrices函数使用数组列为主的布局:

cfg。RowMajor = false;codegenaddMatricesarg游戏{的(2、4)的(2、4)}配置cfg-launchreport

代码生成生成C代码:

/ *天索引,行了* /空白addMatrices(双[4][2],双B[4][2],双[4]和[2]){int行;int上校;连续(= 0;行< 2;行+ +){(col = 0;坳< 4;坳+ +){总和(col)(行)= (col)(行)+ B (col)(行);}}}

输入和输出矩阵C代码中最初的MATLAB矩阵的转置。要理解为什么,考虑如何在计算机内存数组表示。MATLAB语言使用默认列为主的布局,从第一个元素(最左边的)维度或指标是连续的在内存中。C使用行数组默认布局,从最后一个元素(右边的)维度或指标是连续的。保留原始元素邻接,代码生成器必须扭转阵列尺寸的顺序。

例如,在这种情况下,如果您定义了MATLAB矩阵一个为:

=重塑(1:8,2、4)

一个= 1 3 5 7 2 4 6 8

然后,因为MATLAB使用列为主的布局、内部数据存储的顺序:

(:)”= 1 2 3 4 5 6 7 8

在C代码,您必须变换原始数据,对于这个示例,叫它AA:

AA = {{1,2}, {3、4}, {5、6}, {7 8}};

达到相同的内部存储数据元素的列表顺序。换句话说,必须4×2的矩阵C数组。(你可以得到一个等价的存储顺序由数组定义为一个2×4AA = {{1, 2, 3, 4}, {5、6、7、8}}。然而,获得此订单需要手动重塑或重新排列数据。)

阵列布局的选择只影响内部数据表示和计算或算法的结果不会改变。保存的直观的外观MATLAB数组在生成的代码中,使用n维索引行阵列布局。注意,行布局会影响生成的代码的效率。有关更多信息,请参见代码行阵列布局设计

其他的代码生成考虑

考虑其他方面的n维索引。代码生成器总是产生一维阵列n维向量,即使你指定n维索引。例如,如果您为一个MATLAB向量生成代码:

= 0 (10)

一个= 0 (1,1)

结果C / c++数组存储:

一个[10]

n维索引也适用于数组和结构。例如,如果你在代码声明结构:

x =结构(“f1”的(2、3));coder.cstructname (x,“myStruct1”);y =结构(“f2”的(6,1));coder.cstructname (y,“myStruct2”);

然后生成的代码包含结构定义:

typedef struct{双f1 [2] [3];}myStruct1;typedef struct{双f2 [6];}myStruct2;

避免在n维线性索引数组。线性索引时,例如,当您使用冒号运算符:

(:)

应用线性索引、代码生成器必须把n维数组转化为一个一维数组。铸造操作使您的代码更复杂的代码生成器的分析。这增加了复杂性可以阻碍的能力代码生成器来优化性能。

最后,请注意以下几点:

  • 您可以使用n维索引任何数据类型的数组。

  • 只固定大小的数组,而不是适应可变数组,可以使用n维索引。

另请参阅

||

相关的话题