最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

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

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

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

変数の再利用の一般的な例として、if-elseif-else または switch-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

例3 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 が表示されます。

  4. 変数のリストで t>1 をクリックします。レポートでは、if ステートメントの内側にある変数 t のインスタンスが強調表示されます。t のこれらのインスタンスは double 型のスカラーです。

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

変数の再利用の制限

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

  • 永続変数

  • グローバル変数

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

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

  • coder.cstructname を使用して名前が制御される変数

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

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

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