exponenta event banner

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

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

Следующие фрагменты кода требуют, чтобы эти определения использовали matlab::data::ArrayFactory и 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);

См. также

Связанные темы