主要内容

启用具有隐式扩展的代码

隐式扩展是指兼容操作数的自动尺寸变化以应用元素操作。如果对于每个维度,阵列的尺寸是相同的,则具有兼容的大小。看兼容阵列大小用于基本操作

默认情况下启用了生成代码中的隐式扩展。启用隐式扩展生成的代码可能与以这些方式禁用的隐式扩展生成的代码不同:

  • 输出大小

  • 附加代码生成

  • 性能变化

对于可变大小的动态阵列,生成的代码显示了这些更改,以在运行时完成隐式扩展。

对于固定大小和恒定数组,由于在编译时已知操作数的值和大小,因此生成的用于计算隐式扩展输出的代码不需要额外的代码生成或引起性能变化。

要控制生成的代码中的隐式扩展,请参见优化生成代码中的隐式扩展

输出大小

隐式扩展会自动扩展操作数以应用元素操作。例如,考虑兼容大小的这些输入类型:

a_type = coder.typeof(1,[2 1]);b_type = coder.typeof(1,[2 inf]);

具有隐式扩展的这两个操作数上的二进制操作会自动扩展一种导致输出尺寸为2厘米。由于禁用隐式扩展,一种不会自动扩展,并且输出大小为2 by-1。

对于在生成代码中禁用隐式扩展而创建的现有工作流程,为同一MATLAB生成代码®具有隐式扩展的代码可能会生成大小不匹配错误或更改二进制操作和功能输出的大小。要解决尺寸不匹配错误,请参见诊断和修复可变大小的数据错误

附加代码生成

如果操作数兼容,则隐式扩展可以自动扩展操作数。为了执行此大小更改,生成的代码引入了允许操作数扩展的代码。

例如,考虑以下代码段。功能vector_sum找到两个阵列的总和。

功能out = vector_sum(a,b)out = a + b;结尾

考虑此处定义的可变大小动态数组:

c_type = coder.typeof(1,[1 inf]);

生成代码vector_sum通过使用此命令:

代码根vector_sum-args{c_type,c_type}-config:lib-报告

此表中列出了带有和不隐含扩展的此功能的生成代码。

已禁用隐式扩展的生成代码 启用了具有隐式扩展的生成代码
void vector_sum(const emxarray_real_t *a,const emxarray_real_t *b,emxarray_real_t *out){int i;int loop_ub;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  data [i] = b-> data [i]+a-> data [i];}}}
静态void plus(emxarray_real_t *out,const emxarray_real_t *b,const emxarray_real_t *a){int i;.... if(a-> size [1] == 1){out-> size [1] = b-> size [1];} else {out-> size [1] = a-> size [1];} .... if(a-> size [1] == 1){loop_ub = b-> size [1];} else {loop_ub = a-> size [1];} for(i = 0; i  data [i] = b-> data [i * stride_0_1]+a-> data [i * 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); } }

启用了隐式扩展,代码生成器会创建一个支持功能,在这种情况下金宝app,进行尺寸变化并计算输出。

在大多数情况下,执行隐式扩展的支撑函数金宝app是以其协助的二进制操作命名的。在上一个示例中,如果表达式out = a + b已更改为out = a -b,支持功能的名称更改为金宝app

一些支持功金宝app能也可能被命名为扩张_OP, 在哪里OP指二进制操作。在上一个示例中,如果表达式out = a + b被替换out = max(a,b),生成的代码中支持函数的名称更改为金宝appExpand_max

如果表达式中的多个操作需要隐式扩展,则生成的代码包含一个命名的支持功能金宝appbinary_expand_op。支持功能金宝app会改变操作数的大小,并应用二进制操作。

如果要应用特定的二进制操作和功能而不隐含扩展,请使用Coder.SamesizeBinaryOp。生成的应用此功能的代码不包括扩展操作数的其他代码。此函数的输出不会扩展MATLAB中的操作数。此功能不支持标量扩展。金宝app操作数必须具有相同的大小。

如果要在生成的代码中禁用该功能中所有二进制操作的函数中的隐式扩展,请致电编码器。noimplicitexpansionInfinction在所需的功能中。MATLAB代码中的隐式扩展仍然启用。

性能变化

启用隐式扩展生成的代码可能与禁用隐式扩展时的性能不同。根据使用隐式扩展的生成代码的输入,代码可能需要更长的时间来评估输出。

如果生成的代码由于隐式扩展而与工作流的性能要求不符,请通过关闭针对特定二进制操作,特定功能体或整个项目的隐性扩展来为您的项目生成代码。看优化生成代码中的隐式扩展

笔记

在禁用隐式扩展之前,请确保外部代码不使用隐式扩展。如果您的项目包含来自外部来源的MATLAB代码,则禁用整个项目的隐式扩展可能会导致错误。

也可以看看

|

相关话题