Main Content

複数のシグネチャをもつ関数のコードの生成

エントリポイント関数は、コードを生成する最上位の 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 つの異なるデータ型 doubleint8 および 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 を実行すると、同じ出力が生成されます。これらのテスト ケースでは、myAddmyAdd_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 を実行すると、同じ出力が生成されます。これらのテスト ケースでは、myAddmyMul、および生成された MEX 関数 myMath が同じ動作になることを検証します。

制限

複数シグネチャの MEX (ポリモーフィック MEX) の生成では以下はサポートされません。

参考

|

関連するトピック