複数のシグネチャをもつ関数のコードの生成
エントリポイント関数は、コードを生成する最上位の MATLAB® 関数です。エントリポイント関数に入力がある場合、コードを生成するには入力のプロパティを指定しなければなりません。この場合、生成されたコードは、コード生成中に指定したエントリポイント関数のシグネチャでのみ動作します。
エントリポイント関数で複数のシグネチャがサポートされている場合は、シグネチャごとに個別の MEX 関数を生成するのではなく、1 つの MEX 関数を生成できます。さらに、各シグネチャに対応する C/C++ コードを生成することもできます。生成されたコードは、コード生成中に指定した複数のシグネチャで動作します。
複数シグネチャの機能を使用すると、以下のことができます。
エントリポイント関数で指定した複数のシグネチャをサポートするコードを生成する。
エントリポイント関数のシグネチャごとに個別の MEX 関数を生成して使用するためのオーバーヘッドを削減する。
生成された MEX 関数で MATLAB 関数のような動作を実現する。
1 つのエントリポイント関数に対する複数シグネチャの MEX 関数の生成
複数シグネチャの MEX (ポリモーフィック MEX) 関数を生成するために、次の関数 myAdd
を考えてみます。
function y = myAdd(a,b) %#codegen y = a+b; end
myAdd
から、3 つの異なるデータ型 double
、int8
および vector of doubles
で動作する MEX 関数を生成するとします。3 つの引数を {1,2}
、{int8(2), int8(3)}
および {1:10, 1:10}
として指定します。エントリポイント関数の後に、エントリポイント関数のシグネチャごとに -args
を指定します。関数 myAdd
のコードを生成するには、MATLAB コマンド プロンプトで次の codegen
コマンドを実行します。
codegen -config:mex myAdd.m -args {1,2} -args {int8(2),int8(3)} -args {1:10,1:10} -report
codegen
コマンドで指定したシグネチャに対して 1 つの MEX 関数 myAdd_mex
が生成されます。コマンド プロンプトで、生成された MEX 関数 myAdd_mex
を呼び出します。myAdd_mex
に渡す値が codegen
コマンドで指定した入力プロパティと一致することを確認します。
myAdd_mex(3,4)
ans = 7
myAdd_mex(int8(5),int8(6))
ans = int8 11
myAdd_mex(1:10,2:11)
ans = 3 5 7 9 11 13 15 17 19 21
これらの入力値を使用して MATLAB 関数 myAdd
を実行すると、同じ出力が生成されます。これらのテスト ケースでは、myAdd
と myAdd_mex
が同じ動作になることを検証します。
複数のエントリポイント関数に対する複数シグネチャの MEX 関数の生成
コード生成中に、複数のシグネチャを含む複数のエントリポイント関数に対して 1 つの MEX 関数を生成することもできます。
2 つのエントリポイント関数 myAdd
および myMul
があるとします。最初のエントリポイント関数 myAdd
は、2 つの値の合計を返します。
function y = myAdd(a,b) %#codegen y = a+b; end
2 番目のエントリポイント関数 myMul
は、2 つの値の乗算を返します。
function y = myMul(a,b) %#codegen y = a*b; end
エントリポイント関数の後に、エントリポイント関数のシグネチャごとに -args
を指定します。関数 myAdd
では入力型 double
および int8
がサポートされると考えます。これらの引数を {1,2}
および {int8(1), int8(2)}
として指定します。同様に、関数 myMul
で入力型 double
および int16
がサポートされる場合は、これらの引数を {1,2}
および {int16(1), int16(2)}
として指定します。これで、エントリポイント関数から MEX 関数を生成できます。
関数 myAdd
および myMul
のコードを生成するには、MATLAB コマンド プロンプトで次の codegen
コマンドを実行します。
codegen -config:mex myAdd.m -args {1,2} -args {int8(1),int8(2)} myMul.m -args {1,2} -args {int16(1),int16(2)} -o 'myMath' -report
この構文により、codegen
コマンドで指定したすべてのシグネチャに対して 1 つの MEX 関数 myMath
が生成されます。
コマンド プロンプトで、生成された MEX 関数 myMath
を使用して出力値を確認できます。myMath
に渡す値がコード生成前に指定した入力プロパティと一致することを確認します。
myMath("myAdd",3,4)
ans = 7
myMath("myAdd",int8(5),int8(6))
ans =
int8
11
myMath("myMul",3,4)
ans = 12
myMath("myMul",int16(5),int16(6))
ans =
int16
30
これらの入力値を使用して MATLAB 関数 myAdd
および myMul
を実行すると、同じ出力が生成されます。これらのテスト ケースでは、myAdd
、myMul
、および生成された MEX 関数 myMath
が同じ動作になることを検証します。
制限
複数シグネチャの MEX (ポリモーフィック MEX) の生成では以下はサポートされません。
fiaccel
(Fixed-Point Designer)-float2fixed
の構成。プログラムによる入力パラメーターの定義。MATLAB コードでの assert ステートメントを使用した入力プロパティの定義を参照してください。