同じ変数を異なるプロパティで再利用する
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))); end
example1
の 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 関数の変数