Вызовите функции 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);
matlab:: двигатель:: MATLABEngine:: feval