Вызовите функции MATLAB® от MEX-функций с помощью MATLAB:: механизм:: MATLABEngine:: функция feval. feval
позволяет вам передать аргументы от MEX-функций до функций MATLAB и возвратить результаты в MEX-функцию.
Следующие фрагменты кода требуют, чтобы эти определения использовали matlab::data::ArrayFactory
и Engine API для C++.
matlab::data::ArrayFactory factory; std::shared_ptr<matlab::engine::MATLABEngine> matlabPtr = getEngine();
Этот пример вызывает функцию sqrt
MATLAB со следующими входными параметрами:
Функция, имя передало как строка UTF16
Входные параметры к функции sqrt
, заданной как matlab::data::Array
Значением, возвращенным к MEX-функции, является четырехэлементный matlab::data::Array
, содержащий четыре значения для квадратного корня из входного массива.
Пример перемещает возвращенное значение в matlab::data::TypedArray
, который обеспечивает итераторы, используемые в основанном на области значений цикле for
, который создает массив типа double
от результатов, возвращенных функцией sqrt
MATLAB.
// 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-функции.
Этот код вызывает функцию gcd
MATLAB со следующими входными параметрами:
Имя функции передало как строка 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);