通过不同属性重用同一变量
对于 C/C++ 代码生成,有一些变量可以在初始赋值后用不同类、大小或复/实性重新赋值。变量可以保留具有相同类和复/实性、但大小不同的值。如果初始赋值的大小不是常量,则在生成的代码中变量是动态调整大小的。有关详细信息,请参阅Variable-Size Data。
如果每次出现的变量只能有一种类型,则可以在初始赋值后重新赋值变量的类型(类、大小和复/实性)。在这种情况下,变量在生成的代码中会重命名,以创建多个自变量。
可通过不同属性重用同一变量的情形
如果代码生成器能够在 C/C++ 代码生成过程中明确地确定一个输入、输出或局部变量的每wh 实例的属性,则可以不同的类、大小或复/实性重用(或重新赋值)该变量。如果是这种情况,MATLAB® 可在生成的代码中创建单独的唯一命名的局部变量。您可以在代码生成报告中查看这些重命名的变量。
变量重用的一个常见示例是在 if-elseif-else
或 switch-case
语句中。例如,以下函数 example1
首先在 if
语句中使用变量 t,其中它保留一个双精度标量,然后在 if
语句之外重用 t 来保留一个双精度向量。
function y = example1(u) %#codegen if all(all(u>0)) % First, t is used to hold a scalar double value t = mean(mean(u)) / numel(u); u = u - t; end % t is reused to hold a vector of doubles t = find(u > 0); y = sum(u(t(2:end-1)));
无法重用变量的情形
如果无法在代码生成过程中明确地确定一个变量的实例的类、大小和复/实性,则无法重用(重新赋值)该变量。在这种情况下,无法重命名变量,并且会出现编译错误。
例如,以下 example2
函数为 if
语句中的 x 赋予一个定点值,并重用 x 以在 else
子句中存储一个双精度矩阵。然后,它又在 if-else
语句之后使用了 x。此函数会生成编译错误,因为在 if-else
语句后,变量 x 可能有不同属性(具体取决于执行哪个 if-else
子句)。
function y = example2(use_fixpoint, data) %#codegen if use_fixpoint % x is fixed-point x = fi(data, 1, 12, 3); else % x is a matrix of doubles x = data; end % When x is reused here, it is not possible to determine its % class, size, and complexity t = sum(sum(x)); y = t > 0; end
要查看 MATLAB 如何重命名重用的变量 t
,请执行下列步骤:
创建包含以下代码的 MATLAB 文件
example1.m
。function y = example1(u) %#codegen if all(all(u>0)) % First, t is used to hold a scalar double value t = mean(mean(u)) / numel(u); u = u - t; end % t is reused to hold a vector of doubles t = find(u > 0); y = sum(u(t(2:end-1))); end
为
example1
生成一个 MEX 函数,并生成代码生成报告。codegen -o example1x -report example1.m -args {ones(5,5)}
打开代码生成报告。
在变量选项卡上,您可以看到两个唯一命名的局部变量
t>1
和t>2
。在变量列表中,点击
t>1
。该报告突出显示变量t
在if
语句中的实例。t
的这些实例是双精度标量。点击
t>2
。代码生成报告突出显示t
在if
语句之外的实例。t
的这些实例是可变大小的列向量,其上界为25
。
变量重用的限制
无法在生成的代码中重命名以下变量:
持久变量。
全局变量。
使用
coder.ref
、coder.rref
、coder.wref
传递给 C 代码的变量。使用
coder.varsize
设置其大小的变量。使用 MATLAB Coder™ 生成代码时,其名称由
coder.cstructname
控制的变量。在
for
循环的循环体中使用的索引变量。Simulink® 模型中 MATLAB Function 模块的模块输出。
Stateflow® 图中 MATLAB 函数的图自有变量。