MEX 関数からの MATLAB 関数の呼び出し
関数fevalを使用して、MEX 関数から MATLAB® 関数を呼び出します。feval
を使用すると、MEX 関数から MATLAB 関数に引数を渡し、結果を MEX 関数に返すことができます。
次のコード スニペットでは、matlab::data::ArrayFactory
とmatlab::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);