同じ変数を異なるプロパティで再利用する
C/C++ コード生成においては、最初の代入のときとは異なるクラス、サイズ、実数/複素数の値を代入し直すことができる以下の特定の変数が存在します。変数は、クラスと実数/複素数が同じでサイズが異なる値を格納することができます。初期に割り当てられたサイズが一定ではない場合、生成されたコードではその変数は動的にサイズが変化するものになります。詳細については、可変サイズ データを参照してください。
変数が最初に割り当てられた後、出現するごとに 1 つのタイプ (クラス、サイズ、実数/複素数) しかもてない場合は、それを再割り当てすることができます。この場合、変数は生成コード内で名前が変更され、複数の独立変数が作成されます。
同じ変数を異なるプロパティで再利用できる場面
コード ジェネレーターが 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
再利用される変数 t の名前が MATLAB によってどのように変更されるかを確認するには以下のようにします。
以下のコードを含む 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))); endexample1の MEX 関数を生成して、コード生成レポートを作成します。codegen -o example1x -report example1.m -args {ones(5,5)}コード生成レポートを開きます。
[変数] タブに、2 つの一意の名前をもつローカル変数
t>1およびt>2が表示されます。
変数のリストで
t>1をクリックします。レポートでは、ifステートメントの内側にある変数tのインスタンスが強調表示されます。tのこれらのインスタンスは double 型のスカラーです。t>2をクリックします。コード生成レポートでは、ifステートメントの外側にあるtのインスタンスが強調表示されます。tのこれらのインスタンスは、上限が25の可変サイズの列ベクトルです。
変数の再利用の制限
以下の変数は生成されたコードで名前を変更することができません。
永続変数
グローバル変数。
coder.ref、coder.rref、coder.wrefを使用して C コードに渡される変数coder.varsizeを使用してサイズが設定される変数coder.cstructnameを使用して名前が制御される変数 (MATLAB Coder™ を使用してコードを生成する場合)。forループのインデックス変数 (ループ本体内で使われている場合)Simulink® モデル内の MATLAB Function ブロックのブロック出力
Stateflow® チャート内の、チャートが保有する MATLAB 関数の変数