コード生成用の入力の型の指定
C/C++ と MATLAB® では変数の扱いが異なります。それらの違いのうちでコード生成ワークフローに影響するものは次のとおりです。
C/C++ ソース コードには、すべての変数について型宣言が含まれています。それらの宣言を使用して、コンパイル時に C/C++ コンパイラがすべての変数の型を決定します。MATLAB コードには、明示的な型宣言はありません。実行時に MATLAB 実行エンジンが変数の型を決定します。
C/C++ では、配列のメモリをコンパイル時に静的に宣言する (固定サイズの配列) ことも、実行時に動的に割り当てる (可変サイズの配列) こともできます。MATLAB では、配列のメモリはいずれも動的に割り当てられ、すべての配列が可変サイズになります。
C/C++ コードの生成で特定の型を使用するには、MATLAB のエントリポイント関数に対するすべての入力変数のプロパティ (クラス、サイズ、実数/複素数) を C/C++ コードまたは MEX コードの生成時に指定しなければなりません。"エントリポイント関数" は、コードを生成する最上位の MATLAB 関数です。コード ジェネレーターは、それらの入力プロパティを使用して、生成コードに含まれるすべての変数のプロパティを決定します。入力の型の指定が異なっていると、同じ MATLAB コードから異なるバージョンの生成コードが生成されることがあります。
以下のように入力の型を指定できます。
入力の型の指定による生成コードへの影響について、簡単な MATLAB 関数で確認してみましょう。ここでは、2 つの量 a
と b
の積を求めてその値を返す myMultiply
を使用します。
function y = myMultiply(a,b) y = a*b; end
入力引数 a
と b
の 3 つの異なる型指定による静的な C ライブラリ コードを生成します。それぞれの場合について、生成されるコードを検証します。
a
とb
を実数で double のスカラーとして指定します。これらの入力のコードを生成するには、次のコマンドを実行します。生成される C ソース ファイルa = 1; codegen -config:lib myMultiply -args {a,a}
myMultiply.c
に含まれる C 関数は次のようになります。double myMultiply(double a, double b) { return a * b; }
a
とb
を実数で double の5
行5
列の行列として指定します。これらの入力のコードを生成するには、次のコマンドを実行します。生成される C ソース ファイルa = zeros(5,5); codegen -config:lib myMultiply -args {a,a}
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 コードの入力a
とb
に対応します。C コードの 1 次元配列a
とb
のサイズは25
です。これは、関数codegen
を呼び出したときに使用したサンプル入力配列の要素の合計数と同じです。C 関数にはもう 1 つ引数があります。サイズが
25
の 1 次元配列y
です。この配列は関数の出力を返すために使用されます。配列の次元を MATLAB コードと同じにしてコードを生成することもできます。N 次元インデックスを使用するコードの生成を参照してください。
最後に、複数の異なるサイズの入力配列を受け入れる
myMultiply
のコードを生成します。可変サイズの入力を指定するには、関数coder.typeof
を使用します。coder.typeof(A,B,1)
は、クラスと実数/複素数がA
と同じで、上限がサイズ ベクトルB
の対応する要素で与えられる可変サイズの入力を指定します。a
とb
を実数で double の可変サイズ配列として指定します。最大サイズはどちらの次元も10
です。コードを生成するには、次のコマンドを実行します。生成される C 関数のシグネチャは次のようになります。a = coder.typeof(1,[10 10],1); codegen -config:lib myMultiply -args {a,a}
引数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_data
、b_data
、およびy_data
は、元の MATLAB 関数の入力引数a
とb
および出力引数y
に対応します。これで、a_data
、b_data
、およびy_data
のサイズを実行時に指定する 3 つの追加の引数a_size
、b_size
、およびy_size
を C 関数が受け入れるようになります。