主要内容

在生成的代码优化隐式扩张

隐式扩张在生成的代码中默认情况下是启用的。代码生成器在生成的代码中引入了修改执行隐式扩张。生成的代码的变化可能导致额外的代码来扩展操作数。操作数的扩张可能会影响生成的代码的性能。看到生成代码启用了隐式的扩张

隐式的扩张可能会改变输出的大小从支持的运营商和功能导致您的工作流大小和类型不匹配的错误。万博1manbetx

启用隐式扩张的细粒度控制在生成的代码中,在MATLAB中使用以下功能®代码:

例如,考虑这个代码片段。这个函数vector_sum发现两个数组的和兼容的大小。

函数= vector_sum (a, b) = b +;结束

a和b的操作数类型被定义为:

a_type =编码器。typeof (1、1 [2])%大小:2 x1b_type =编码器。typeof(1, 2正)%大小:2 x:正

没有隐式的扩张,的大小变量计算2 x1

代码生成报告的形象在上空盘旋+操作。对话框操作产生的轮廓大小、阶级和操作的复杂性。输出变量的大小不隐式扩张显示为2 x 1。

隐式扩张,变量的大小是计算2 x: ?

代码生成报告的形象在上空盘旋+操作。对话框操作产生的轮廓大小、阶级和复杂性。还提到,粗体所示的尺寸意味着可能使用隐式扩张。输出变量的大小,显示为2 x: ?。

这些代码片段轮廓的变化生成的代码的功能vector_sum,而隐式扩张是禁用和启用。生成的代码,操作数的类型一个b被定义为:

a_type =编码器。[1正]typeof (1)%大小:1 x:正b_type =编码器。[1正]typeof (1)%大小:1 x:正
生成的代码与隐式扩张禁用 生成的代码启用了隐式的扩张
空白vector_sum (const emxArray_real_T *, const emxArray_real_T * b, emxArray_real_T *) {int我;int loop_ub;我= - >大小[0]*[1]- >大小;- >大小[0]= 1;——> [1]= b - >大小[1];emxEnsureCapacity_real_T(我);loop_ub = b - >大小[1];(我= 0;我< loop_ub;我+ +){- >数据[我]=[我]+ b - >数据- >数据(我); } }
静态空间+ (emxArray_real_T *, const emxArray_real_T * b, const emxArray_real_T * a) {int我;....如果(- >大小[1]= = 1){出- > [1]= b - >大小[1];别的}{- >大小[1]=[1]- >大小;}....如果(- >大小[1]= = 1){loop_ub = b - >大小[1];其他}{loop_ub =[1] - >大小;}(i = 0;我< loop_ub;我+ +){- >数据[我]= b - >数据(我* stride_0_1) + - >数据(我* stride_1_1); } } void vector_sum(const emxArray_real_T *a, const emxArray_real_T *b, emxArray_real_T *out) { int i; int loop_ub; if (b->size[1] == a->size[1]) { i = out->size[0] * out->size[1]; out->size[0] = 1; out->size[1] = b->size[1]; emxEnsureCapacity_real_T(out, i); loop_ub = b->size[1]; for (i = 0; i < loop_ub; i++) { out->data[i] = b->data[i] + a->data[i]; } } else { plus(out, b, a); } }

禁用在指定函数通过使用隐式扩张coder.noImplicitExpansionInFunction

如果您需要隐式扩张您的项目在特定功能,但不是禁用隐式扩张函数通过调用生成的代码coder.noImplicitExpansionInFunction在函数内。

例如,生成的代码vector_sum不适用隐式扩张。

MATLAB代码 生成的代码与coder.sameSizeBinaryOp
函数= vector_sum (a, b) coder.noImplicitExpansionInFunction ();= a + b;结束
一个=编码器。[1正]typeof (1)%大小:1 x:正b =编码器。[1正]typeof (1)%大小:1 x:正codegenvector_sum-launchreportargs {a、b}配置:自由
空白vector_sum (const emxArray_real_T *, const emxArray_real_T * b, emxArray_real_T *) {int我;int loop_ub;我= - >大小[0]*[1]- >大小;- >大小[0]= 1;——>大小[1]=[1]- >大小;emxEnsureCapacity_real_T(我);loop_ub =[1] - >大小;(我= 0;我< loop_ub;我+ +){- >数据[我]=[我]- >数据+ b - >数据(我); } }

请注意

coder.noImplicitExpansionInFunction没有禁用隐在MATLAB代码的扩张。它只禁用隐式扩张在生成的代码中。

禁用特定二进制操作通过使用隐式扩张coder.sameSizeBinaryOp

使用的函数coder.sameSizeBinaryOp执行一个错误检查,确保操作数是相同的大小和防止代码生成器生成隐式扩展代码功能。

例如,通过使用这个代码片段应用+操作coder.sameSizeBinaryOp没有隐式的扩张。

MATLAB代码 生成的代码
函数= vector_sum (a, b) =编码器。sameSizeBinaryOp (@plus, a, b);结束
一个=编码器。[1正]typeof (1)%大小:1 x:正b =编码器。[1正]typeof (1)%大小:1 x:正codegenvector_sum-launchreportargs {a、b}配置:自由
空白vector_sum (const emxArray_real_T *, const emxArray_real_T * b, emxArray_real_T *) {int我;int loop_ub;我= - >大小[0]*[1]- >大小;- >大小[0]= 1;——>大小[1]=[1]- >大小;emxEnsureCapacity_real_T(我);loop_ub =[1] - >大小;(我= 0;我< loop_ub;我+ +){- >数据[我]=[我]- >数据+ b - >数据(我); } }

coder.sameSizeBinaryOp不支持标量扩张。万博1manbetx操作数给coder.sameSizeBinaryOp必须是相同的大小。

禁用隐式扩张您的项目

如果你不需要隐式扩张在生成的代码或不希望修改影响你生成的代码,通过设置把它关掉EnableImplicitExpansion国旗在你coder.config对象。这个标志被设置为真正的默认情况下。

cfg = coder.config;cfg。EnableImplicitExpansion = false;

禁用隐式扩张你的仿真软件万博1manbetx®模型通过设置model-wide参数启用隐式扩张在MATLAB函数。另外,使用这个命令:

set_param (gcs,“EnableImplicitExpansion”、假);

请注意

之前关掉隐式扩张,确保外部代码不使用隐式扩张。禁用隐式扩张为整个项目生成代码时可能会导致错误如果你的项目包括MATLAB代码从外部来源。

另请参阅

|

相关的话题