コード生成用の入力の型の指定
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 関数が受け入れるようになります。