未使用の実行パスのコード生成を防ぐ方法
変数が if, elseif, else
ステートメントまたは switch, case, otherwise
ステートメントのフローを制御する場合、ステートメントの 1 つの分岐に対してのみコード生成が実行されるように、その変数を定数として宣言します。
制御フロー変数の性質に応じて、定数として以下の 2 とおりの方法で宣言できます。
変数が MATLAB® 関数に対してローカルである場合は、MATLAB コードの定数値に変数を割り当てます。例については、ローカル変数でフローを制御するときのコード生成を防ぐ方法を参照してください。
変数が MATLAB 関数への入力である場合は、
coder.Constant
を使用して変数を定数として宣言できます。例については、入力変数でフローを制御するときのコード生成を防ぐ方法を参照してください。
ローカル変数でフローを制御するときのコード生成を防ぐ方法
入力変数
in
を取り込み、選択変数ch
がs
に設定されているか、c
に設定されているかによって、その要素を二乗または三乗する関数SquareOrCube
を定義します。function out = SquareOrCube(ch,in) %#codegen if ch=='s' out = in.^2; elseif ch=='c' out = in.^3; else out = 0; end
codegen
コマンドを使用して、SquareOrCube
のコードを生成します。codegen -config:lib SquareOrCube -args {'s',zeros(2,2)}
生成された C コードでは、
ch
の入力に基づいて 2 行 2 列の行列の要素を二乗または三乗します。以下の行を
SquareOrCube
の定義に追加します。ch = 's';
生成された C コードでは、2 行 2 列の行列の要素を二乗します。選択変数
ch
とif/elseif/if
ステートメントのその他の分岐は、生成コード内には出現しません。
入力変数でフローを制御するときのコード生成を防ぐ方法
入力
flag
の値に応じて、入力in
のさまざまな数学演算を実行する関数MathFunc
を定義します。function out = MathFunc(flag,in) %#codegen %# codegen switch flag case 1 out=sin(in); case 2 out=cos(in); otherwise out=sqrt(in); end
codegen
コマンドを使用して、MathFunc
のコードを生成します。codegen -config:lib MathFunc -args {1,zeros(2,2)}
生成された C コードでは、
flag
の入力に基づいて 2 行 2 列の行列の要素でさまざまな数学演算を実行します。coder.Constant
を使用して引数flag
を定数として宣言するMathFunc
のコードを生成します。codegen -config:lib MathFunc -args {coder.Constant(1),zeros(2,2)}
生成された C コードでは、2 行 2 列の行列の要素の正弦を求めます。変数
flag
とswitch/case/otherwise
ステートメントは、生成コード内には出現しません。