MEX-функция C++ является классом, который заменяет оператор вызова функции, operator()
, чтобы создать функциональный объект или функтор. Эти объекты ведут себя как функции MATLAB®, которые могут принять входные параметры и возвратить выходные параметры.
Включайте эти заголовочные файлы:
mEX. hpp
— Включают этот файл для API C++ MEX.
mexAdapter.hpp
— Включайте этот файл однажды для реализации класса MexFunction
API C++ MEX содержатся в этих пространствах имен:
mATLAB:: mex
— интерфейс MEX
mATLAB:: данные
— MATLAB Data API
mATLAB:: механизм
— Engine API для C++
Задайте MEX-функцию C++ как класс под названием MexFunction
, который выводит от класса matlab::mex::Function
. Класс MexFunction
заменяет виртуальный operator()
класса matlab::mex::Function
.
#include "mex.hpp" #include "mexAdapter.hpp" class MexFunction : public Function { public: void operator()(matlab::mex::ArgumentList outputs, matlab::mex::ArgumentList inputs) { // check input arguments // implement function ... } }
MATLAB передает каждый входной параметр как matlab::data::Array
в MATLAB:: контейнер mex::ArgumentList. Доступ к каждому входному параметру путем индексации в массив ArgumentList
. Например, inputs[0]
является первым входным параметром, inputs[1]
является вторым и так далее. Число элементов в переменной inputs
равняется количеству входных параметров, переданных MEX-функции, когда функция вызвана. итераторы поддержки ArgumentList
и могут использоваться в основанных на области значений циклах for
.
Присвойте выходные аргументы выходной переменной. Например, outputs[0]
является первый присвоенный вывод, outputs[1]
является вторым и так далее. Число элементов в переменной outputs
равняется количеству выходных параметров, присвоенных, когда функция вызвана.
Часто полезно присвоить входные параметры другим типам массивов данных MATLAB. Определенные типы как matlab::data::TypedArray<T>
или matlab::data::CharArray
обеспечивают дополнительную функциональность как функции конвертера и итераторы. Выберите тип, который совпадает с типом входного параметра.
Например, следующая MEX-функция присваивает входной массив matlab::data::TypedArray<double>
. Этот тип массива поддерживает использование основанного на области значений цикла for, который используется, чтобы умножить каждый элемент в массиве на 2. Измененный массив возвращен в переменной outputs
.
#include "mex.hpp"" #include "mexAdapter.hpp" using namespace matlab::data; using matlab::mex::ArgumentList; class MexFunction : public matlab::mex::Function { public: void operator()(ArgumentList outputs, ArgumentList inputs) { // Validate arguments checkArguments(outputs, inputs); // Implement function TypedArray<double> doubleArray = std::move(inputs[0]); for (auto& elem : doubleArray) { elem *= 2; } // Assign outputs outputs[0] = doubleArray; } void checkArguments(ArgumentList outputs, ArgumentList inputs) { std::shared_ptr<matlab::engine::MATLABEngine> matlabPtr = getEngine(); ArrayFactory factory; if (inputs[0].getType() != ArrayType::DOUBLE || inputs[0].getType() == ArrayType::COMPLEX_DOUBLE) { matlabPtr->feval(u"error", 0, std::vector<Array>({ factory.createScalar("Input must double array") })); } if (outputs.size() > 1) { matlabPtr->feval(u"error", 0, std::vector<Array>({ factory.createScalar("Only one output is returned") })); } } };
Создайте и запустите MEX-функцию.
mex timesTwo.cpp
timesTwo(1:10)
ans = 2 4 6 8 10 12 14 16 18 20
Для получения дополнительной информации о проверке аргументов смотрите Вводы и выводы Обработки.
Вызов MEX-функции от MATLAB инстанцирует класса MexFunction
. Например, этот оператор MATLAB создает экземпляр класса MexFunction
, заданного файлом myMEXFunction.cpp
.
output = myMEXFunction(input);
Этот экземпляр продолжает существовать, пока вы не вызываете clear
MATLAB
команда mex
.
Реализация конструктора класса и деструктора обеспечивает способ выполнить определенные задачи при построении объекта MexFunction
. Например, этот фрагмент кода открывает текстовый файл для чтения в конструкторе и закрывает файл в деструкторе.
#include "mex.hpp" #include "mexAdapter.hpp" #include <fstream> class MexFunction : public Function { std::ifstream inFile; public: MexFunction() { inFile.open("someTextFile.txt"); } ~MexFunction() { inFile.close(); } void operator()(ArgumentList outputs, ArgumentList inputs) { .... } };
Для примера смотрите Управление Внешние Ресурсы от MEX-функций.
matlab::data:: Массив
| matlab::data:: TypedArray