Вызов функций MATLAB из MEX-функций

Вызов MATLAB® функции из MEX-функций, использующих функцию matlab:: engine:: MATLABEngine:: feval. feval позволяет передавать аргументы из MEX-функций в функции MATLAB и возвращать результаты в MEX-функцию.

Следующие фрагменты кода требуют, чтобы эти определения использовали matlab::data::ArrayFactory и Engine API для C++.

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

Один выход

Этот пример вызывает MATLAB sqrt функция со следующими входами:

  • Имя функции, переданное как UTF16 строка

  • Входы в sqrt функция, заданная как matlab::data::Array

Значение, возвращенное в MEX-функцию, является четырехэлементным matlab::data::Array содержащий квадратный корень каждого элемента массива входа.

Пример перемещает возвращенное значение в matlab::data::TypedArray, который обеспечивает итераторы, используемые в основанных на диапазоне for цикл, который создает массив типов double из результатов, возвращенных MATLAB sqrt функция.

// 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 возвращают разное количество выходов в зависимости от того, как вы вызываете функцию. Можно задать количество возвращенных аргументов при вызове функции MATLAB из MEX-функции.

Этот код вызывает MATLAB gcd функция со следующими входами:

  • Имя функции передалось как UTF16 строка

  • Количество выходов, возвращенных функцией MATLAB, заданное как const size_t.

  • Входы в gcd функция, заданная как std::vector от matlab::data::Array элементы.

Возвращаемое значение является std::vector содержит три matlab::data::Array элементы.

// 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);

См. также

Похожие темы