Main Content

同じ変数を異なるプロパティで再利用する

C/C++ コード生成においては、最初の代入のときとは異なるクラス、サイズ、実数/複素数の値を代入し直すことができる以下の特定の変数が存在します。変数は、クラスと実数/複素数が同じでサイズが異なる値を格納することができます。初期に割り当てられたサイズが一定ではない場合、生成されたコードではその変数は動的にサイズが変化するものになります。詳細については、可変サイズ データを参照してください。

変数が最初に割り当てられた後、出現するごとに 1 つのタイプ (クラス、サイズ、実数/複素数) しかもてない場合は、それを再割り当てすることができます。この場合、変数は生成コード内で名前が変更され、複数の独立変数が作成されます。

同じ変数を異なるプロパティで再利用できる場面

コード ジェネレーターが C/C++ コード生成時に、入力、出力またはローカル変数の出現ごとに明確にプロパティを判定できる場合、その変数を、異なるクラス、サイズまたは実数/複素数で再利用 (再割り当て) することができます。そのような場合、MATLAB® は一意の名前をもつ個別のローカル変数を生成コード内に作成します。このような名前が変更された変数は、コード生成レポートで表示できます。

変数の再利用は、一般的には if-elseif-elseswitch-case ステートメントなどで行われます。たとえば、次の関数 example1 は最初に変数 t を if ステートメントで使用し、このときこの変数はスカラーで double の値を保持しています。その後、t を if ステートメントの外で再利用しており、そのときは倍精度のベクトルを保持しています。

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 に固定小数点の値を代入して、else 節では x を再利用して倍精度の行列を格納しています。その後、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 ステートメントにおける変数の再利用

再利用される変数 t の名前が MATLAB によってどのように変更されるかを確認するには以下のようにします。

  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. コード生成レポートを開きます。

    [変数] タブに、2 つの一意の名前をもつローカル変数 t>1 および t>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 をクリックします。レポートでは、if ステートメントの内側にある変数 t のインスタンスが強調表示されます。t のこれらのインスタンスは double 型のスカラーです。

  5. t>2 をクリックします。コード生成レポートでは、if ステートメントの外側にある t のインスタンスが強調表示されます。t のこれらのインスタンスは、上限が 25 の可変サイズの列ベクトルです。

変数の再利用の制限

以下の変数は生成されたコードで名前を変更することができません。

  • 永続変数

  • グローバル変数

  • coder.refcoder.rrefcoder.wref を使用して C コードに渡される変数

  • coder.varsize を使用してサイズが設定される変数

  • coder.cstructname を使用して名前が制御される変数 (MATLAB Coder™ を使用してコードを生成する場合)。

  • for ループのインデックス変数 (ループ本体内で使われている場合)

  • Simulink® モデル内の MATLAB Function ブロックのブロック出力

  • Stateflow® チャート内の、チャートが保有する MATLAB 関数の変数