使用n维索引生成代码
默认情况下,代码生成器使用一维数组的索引。代码生成器创建一维数组在C / c++代码在MATLAB n维数组®代码。您可以使用n维索引来改善可读性和适应接口生成的代码。
此表显示了一个示例的差异在生成的代码中有或没有n维索引。
MATLAB代码 |
生成C代码(默认) |
生成C代码启用了一天索引 |
---|---|---|
一个= 0 (2、4、6) |
一个[48] |
|
对于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维索引。