C++ MEX 関数
MEX、すなわち "MATLAB 実行可能ファイル" とは、自動的に読み込まれ、任意の MATLAB® 関数と同様に呼び出すことのできるプログラムです。
C++ MEX API
C++ MEX 関数は、2 つの C++ API に基づきます。
MATLAB データ API は、MATLAB データ型や、MEX 関数に渡されるデータ配列のコピーオンライトのような最適化をサポートします。詳細については、C++ 用の MATLAB データ APIを参照してください。
MATLAB C++ エンジン API のサブセットによって MATLAB 関数の呼び出し、MATLAB ワークスペースでのステートメントの実行、変数やオブジェクトへのアクセスがサポートされます。詳細については、C++ MEX APIを参照してください。
C++ MEX API は C++11 機能をサポートしていますが、C MEX API との互換性はありません。これらの API を MEX ファイルで混在させることはできません。
C++ MEX 関数の基本設計
C++ MEX 関数は、matlab::mex::Function
から継承される MexFunction
という名前のクラスとして実装されます。MexFunction
クラスは、関数の呼び出し演算子 operator()
をオーバーライドします。この実装は、関数と同様に呼び出せる関数オブジェクトを作成します。
MATLAB から MEX 関数を呼び出すと関数オブジェクトがインスタンス化されます。この関数オブジェクトは、同じ MEX 関数への後続の呼び出しの間、状態を維持します。
C++ MEX 関数の基本設計を次に示します。これは、MexFunction
という名前を付けなければならない matlab::mex::Function
のサブクラスです。MexFunction
クラスは、関数の呼び出し演算子 operator()
をオーバーライドします。
#include "mex.hpp"
#include "mexAdapter.hpp"
class MexFunction : public matlab::mex::Function {
public:
void operator()(matlab::mex::ArgumentList outputs, matlab::mex::ArgumentList inputs) {
// Function implementation
...
}
};
MEX 関数に対する入出力は、matlab::mex::ArgumentList
の要素として渡されます。各入出力引数は matlab::mex::ArgumentList
に含まれる matlab::data::Array
です。
例については、C++ MEX ソース ファイルの作成を参照してください。
MATLAB からの MEX 関数の呼び出し
MEX 関数を呼び出すには、拡張子なしのファイル名を使用します。呼び出し構文は MEX 関数によって定義される入力引数および出力引数によって異なります。MEX ファイルは、呼び出し時に MATLAB パスまたは現在の作業フォルダーになければなりません。
C++ MEX 関数の例
これらの例では、C++ MEX 関数の実装を示します。
arrayProduct.cpp
— 配列をスカラー入力で乗算し、得られた配列を返します。yprime.cpp
— 制約付き三体問題の微分方程式を定義します。phonebook.cpp
— 構造体を操作する方法を示します。modifyObjectProperty.cpp
— MATLAB オブジェクトで作業する方法を示します。