Main Content

MEX 関数からの MATLAB 関数の呼び出し

関数fevalを使用して、MEX 関数から MATLAB® 関数を呼び出します。feval を使用すると、MEX 関数から MATLAB 関数に引数を渡し、結果を MEX 関数に返すことができます。

次のコード スニペットでは、matlab::data::ArrayFactorymatlab::engine::MATLABEngineを使用するために、次の定義が必要です。

matlab::data::ArrayFactory factory;
std::shared_ptr<matlab::engine::MATLABEngine> matlabPtr = getEngine();

単一の出力

この例では、次の入力を指定して MATLAB 関数 sqrt を呼び出します。

  • UTF16 文字列として渡される関数名

  • 関数 sqrt への入力。matlab::data::Array として指定します。

MEX 関数に返される値は、入力配列の各要素の平方根が格納された 4 要素の matlab::data::Array です。

この例では、戻り値を matlab::data::TypedArray に移動します。そこでは、MATLAB 関数 sqrt によって返される結果から double 型の配列を作成する、範囲ベースの for ループで使用される反復子が提供されます。

// Define input and output arguments
matlab::data::Array args({
    factory.createArray<double>({ 1, 4 },{ 1, 2, 3, 4 }) });
matlab::data::Array result;

// Call feval and return 1 argument
result = matlabPtr->feval(u"sqrt", args);
matlab::data::TypedArray<double> returnedValues(std::move(result));

// Create native array
double dataArray[4];
int i = 0;
for (auto elem : returnedValues) {
    dataArray[i] = elem;
    i++;
}

複数の出力

一部の MATLAB 関数は、関数をどのように呼び出すかによって異なる数の出力を返します。MEX 関数から MATLAB 関数を呼び出す際に、返される引数の数を指定できます。

次のコードでは、次の入力を指定して MATLAB 関数 gcd を呼び出します。

  • UTF16 文字列として渡される関数名

  • MATLAB 関数によって返される出力の数。const size_t として指定します。

  • 関数 gcd への入力。matlab::data::Array 要素の std::vector として指定します。

戻り値は、3 つの matlab::data::Array 要素が格納された std::vector となります。

// Define arguments
std::vector<matlab::data::Array> args({
    factory.createScalar<int16_t>(30),
    factory.createScalar<int16_t>(56)});
const size_t numReturned = 3;
std::vector<matlab::data::Array> result;

// Call feval and return 3 arguments
result = matlabPtr->feval(u"gcd", numReturned, args);

参考

関連するトピック