Main Content

コード生成用の入力の型の指定

C/C++ と MATLAB® では変数の扱いが異なります。それらの違いのうちでコード生成ワークフローに影響するものは次のとおりです。

  • C/C++ ソース コードには、すべての変数について型宣言が含まれています。それらの宣言を使用して、コンパイル時に C/C++ コンパイラがすべての変数の型を決定します。MATLAB コードには、明示的な型宣言はありません。実行時に MATLAB 実行エンジンが変数の型を決定します。

  • C/C++ では、配列のメモリをコンパイル時に静的に宣言する (固定サイズの配列) ことも、実行時に動的に割り当てる (可変サイズの配列) こともできます。MATLAB では、配列のメモリはいずれも動的に割り当てられ、すべての配列が可変サイズになります。

C/C++ コードの生成で特定の型を使用するには、MATLAB のエントリポイント関数に対するすべての入力変数のプロパティ (クラス、サイズ、実数/複素数) を C/C++ コードまたは MEX コードの生成時に指定しなければなりません。"エントリポイント関数" は、コードを生成する最上位の MATLAB 関数です。コード ジェネレーターは、それらの入力プロパティを使用して、生成コードに含まれるすべての変数のプロパティを決定します。入力の型の指定が異なっていると、同じ MATLAB コードから異なるバージョンの生成コードが生成されることがあります。

以下のように入力の型を指定できます。

  • arguments ブロックを使用して、エントリポイント関数 MATLAB で関数の引数の検証を実行する

  • MATLAB Coder™ アプリの [入力の型を定義] ペインから行う

  • コマンド ラインで -args オプションを指定して codegen を使用する

  • MATLAB コード内で assert ステートメントを使用して入力変数の前提条件を指定する

入力の型の指定による生成コードへの影響について、簡単な MATLAB 関数で確認してみましょう。ここでは、2 つの量 ab の積を求めてその値を返す myMultiply を使用します。

function y = myMultiply(a,b)
y = a*b;
end

入力引数 ab の 3 つの異なる型指定による静的な C ライブラリ コードを生成します。それぞれの場合について、生成されるコードを検証します。

  • ab を実数で double のスカラーとして指定します。これらの入力のコードを生成するには、次のコマンドを実行します。

    a = 1;
    codegen -config:lib myMultiply -args {a,a}
    生成される C ソース ファイル myMultiply.c に含まれる C 関数は次のようになります。

    double myMultiply(double a, double b)
    {
      return a * b;
    }
  • ab を実数で double の 55 列の行列として指定します。これらの入力のコードを生成するには、次のコマンドを実行します。

    a = zeros(5,5);
    codegen -config:lib myMultiply -args {a,a}
    生成される C ソース ファイル myMultiply.c に含まれる C 関数は次のようになります。

    void myMultiply(const double a[25], const double b[25], double y[25])
    {
      int i;
      int i1;
      double d;
      int i2;
      for (i = 0; i < 5; i++) {
        for (i1 = 0; i1 < 5; i1++) {
          d = 0.0;
          for (i2 = 0; i2 < 5; i2++) {
            d += a[i + 5 * i2] * b[i2 + 5 * i1];
          }
    
          y[i + 5 * i1] = d;
        }
      }
    }
    const double a[25]const double b[25] は、MATLAB コードの入力 ab に対応します。C コードの 1 次元配列 ab のサイズは 25 です。これは、関数 codegen を呼び出したときに使用したサンプル入力配列の要素の合計数と同じです。

    C 関数にはもう 1 つ引数があります。サイズが 25 の 1 次元配列 y です。この配列は関数の出力を返すために使用されます。

    配列の次元を MATLAB コードと同じにしてコードを生成することもできます。N 次元インデックスを使用するコードの生成を参照してください。

  • 最後に、複数の異なるサイズの入力配列を受け入れる myMultiply のコードを生成します。可変サイズの入力を指定するには、関数 coder.typeof を使用します。coder.typeof(A,B,1) は、クラスと実数/複素数が A と同じで、上限がサイズ ベクトル B の対応する要素で与えられる可変サイズの入力を指定します。

    ab を実数で double の可変サイズ配列として指定します。最大サイズはどちらの次元も 10 です。コードを生成するには、次のコマンドを実行します。

    a = coder.typeof(1,[10 10],1);
    codegen -config:lib myMultiply -args {a,a}
    生成される C 関数のシグネチャは次のようになります。

    void myMultiply(const double a_data[], const int a_size[2], const double b_data[],
                    const int b_size[2], double y_data[], int y_size[2])
    引数 a_datab_data、および y_data は、元の MATLAB 関数の入力引数 ab および出力引数 y に対応します。これで、a_datab_data、および y_data のサイズを実行時に指定する 3 つの追加の引数 a_sizeb_size、および y_size を C 関数が受け入れるようになります。

参考

|

関連するトピック