Main Content

通过不同属性重用同一变量

对于 C/C++ 代码生成,有一些变量可以在初始赋值后用不同类、大小或复/实性重新赋值。变量可以保留具有相同类和复/实性、但大小不同的值。如果初始赋值的大小不是常量,则在生成的代码中变量是动态调整大小的。有关详细信息,请参阅可变大小数据

如果每次出现的变量只能有一种类型,则可以在初始赋值后重新赋值变量的类型(类、大小和复/实性)。在这种情况下,变量在生成的代码中会重命名,以创建多个自变量。

可通过不同属性重用同一变量的情形

如果代码生成器能够在 C/C++ 代码生成过程中明确地确定一个输入、输出或局部变量的每wh 实例的属性,则可以不同的类、大小或复/实性重用(或重新赋值)该变量。如果是这种情况,MATLAB® 可在生成的代码中创建单独的唯一命名的局部变量。您可以在代码生成报告中查看这些重命名的变量。

变量重用的一个常见示例是在 if-elseif-elseswitch-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

例 1. if 语句中的变量重用

要查看 MATLAB 如何重命名重用的变量 t,请执行下列步骤:

  1. 创建包含以下代码的 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

  2. example1 生成一个 MEX 函数,并生成代码生成报告。

    codegen -o example1x -report example1.m -args {ones(5,5)}

  3. 打开代码生成报告。

    变量选项卡上,您可以看到两个唯一命名的局部变量 t>1t>2

    This image shows the Variables tab in the code generation report. It displays the two unique local variables, t>1 and t>2, in the Summary column.

  4. 在变量列表中,点击 t>1。该报告突出显示变量 tif 语句中的实例。t 的这些实例是双精度标量。

  5. 点击 t>2。代码生成报告突出显示 tif 语句之外的实例。t 的这些实例是可变大小的列向量,其上界为 25

变量重用的限制

无法在生成的代码中重命名以下变量:

  • 持久变量。

  • 全局变量。

  • 使用 coder.refcoder.rrefcoder.wref 传递给 C 代码的变量。

  • 使用 coder.varsize 设置其大小的变量。

  • 使用 MATLAB Coder™ 生成代码时,其名称由 coder.cstructname 控制的变量。

  • for 循环的循环体中使用的索引变量。

  • Simulink® 模型中 MATLAB Function 模块的模块输出。

  • Stateflow® 图中 MATLAB 函数的图自有变量。