Main Content

未使用の実行パスのコード生成を防ぐ方法

変数が if, elseif, else ステートメントまたは switch, case, otherwise ステートメントのフローを制御する場合、ステートメントの 1 つの分岐に対してのみコード生成が実行されるように、その変数を定数として宣言します。

制御フロー変数の性質に応じて、定数として以下の 2 とおりの方法で宣言できます。

ローカル変数でフローを制御するときのコード生成を防ぐ方法

  1. 入力変数 in を取り込み、選択変数 chs に設定されているか、c に設定されているかによって、その要素を二乗または三乗する関数 SquareOrCube を定義します。

    function out = SquareOrCube(ch,in) %#codegen
     if ch=='s'
         out = in.^2;
     elseif ch=='c'
         out = in.^3;
     else 
         out = 0;
     end
  2. codegen コマンドを使用して、SquareOrCube のコードを生成します。

    codegen -config:lib SquareOrCube -args {'s',zeros(2,2)}

    生成された C コードでは、ch の入力に基づいて 2 行 2 列の行列の要素を二乗または三乗します。

  3. 以下の行を SquareOrCube の定義に追加します。

    ch = 's';

    生成された C コードでは、2 行 2 列の行列の要素を二乗します。選択変数 chif/elseif/if ステートメントのその他の分岐は、生成コード内には出現しません。

入力変数でフローを制御するときのコード生成を防ぐ方法

  1. 入力 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
  2. codegen コマンドを使用して、MathFunc のコードを生成します。

    codegen -config:lib MathFunc -args {1,zeros(2,2)}

    生成された C コードでは、flag の入力に基づいて 2 行 2 列の行列の要素でさまざまな数学演算を実行します。

  3. coder.Constant を使用して引数 flag を定数として宣言する MathFunc のコードを生成します。

    codegen -config:lib MathFunc -args {coder.Constant(1),zeros(2,2)}

    生成された C コードでは、2 行 2 列の行列の要素の正弦を求めます。変数 flagswitch/case/otherwise ステートメントは、生成コード内には出現しません。

関連するトピック