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
sqrt
function, 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
gcd
function, specified as astd::vector
ofmatlab::data::Array
elements.
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);