Call MATLAB Functions from MEX Functions
Call MATLAB® functions from MEX functions using the feval function. feval enables
you to pass arguments from MEX functions to MATLAB functions and to return the results to the MEX function.
The following code snippets require these definitions to use matlab::data::ArrayFactory and matlab::engine::MATLABEngine.
matlab::data::ArrayFactory factory;
std::shared_ptr<matlab::engine::MATLABEngine> matlabPtr = getEngine();Single Output
This example calls the MATLAB
sqrt function with the following
inputs:
The function name, passed as a UTF16 string
The inputs to the
sqrtfunction, specified as amatlab::data::Array
The value returned to the MEX function is a four-element
matlab::data::Array containing the square root of each
element of the input array.
The example moves the returned value to a matlab::data::TypedArray, which
provides iterators used in the range-based for loop that creates
an array of type double from the results returned by the
MATLAB
sqrt function.
// 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++;
}Multiple Outputs
Some MATLAB functions return different numbers of outputs depending on how you call the function. You can specify the number of returned arguments when calling a MATLAB function from a MEX function.
This code calls the MATLAB
gcd function with the following
inputs:
The function name passed as a UTF16 string
The number of outputs returned by the MATLAB function, specified as a
const size_t.The inputs to the
gcdfunction, specified as astd::vectorofmatlab::data::Arrayelements.
The returned value is a std::vector containing three
matlab::data::Array elements.
// 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);