在生成的代码优化隐式扩张
隐式扩张在生成的代码中默认情况下是启用的。代码生成器在生成的代码中引入了修改执行隐式扩张。生成的代码的变化可能导致额外的代码来扩展操作数。操作数的扩张可能会影响生成的代码的性能。看到生成代码启用了隐式的扩张。
隐式的扩张可能会改变输出的大小从支持的运营商和功能导致您的工作流大小和类型不匹配的错误。万博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: ?
。
这些代码片段轮廓的变化生成的代码的功能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-launchreport…args {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-launchreport…args {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代码从外部来源。
另请参阅
coder.noImplicitExpansionInFunction
|coder.sameSizeBinaryOp