未使用の実行パスのコード生成を防ぐ方法
変数が 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ステートメントは、生成コード内には出現しません。