Вызов 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);
matlab:: engine:: MATLABEngine:: feval