Функция C++ MEX является классом, который переопределяет оператор вызова функции, operator()
чтобы создать объект функции или функтор. Эти объекты ведут себя как MATLAB® функции, которые могут принимать входы и выходные выходы возврата.
Включите следующие заголовочные файлы:
mex.hpp
- Включите этот файл для API C++ MEX.
mexAdapter.hpp
- Включить этот файл один раз для реализации MexFunction
класс
API C++ MEX содержатся в следующих пространствах имен:
matlab::mex
- Интерфейс MEX
matlab::data
- MATLAB Data API
matlab::engine
- API двигателя для C++
Задайте функцию C++ MEX как класс с именем MexFunction
который происходит от matlab::mex::Function
класс. The MexFunction
класс переопределяет виртуальную operator()
от matlab::mex::Function
класс.
#include "mex.hpp" #include "mexAdapter.hpp" class MexFunction : public matlab::mex::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 be 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);
Этот образец продолжает существовать до тех пор, пока вы не вызовете MATLAB clear
mex
команда.
Реализация конструктора классов и деструктора предоставляет способ выполнить определенные задачи при построении MexFunction
объект. Например, этот фрагмент кода открывает текстовый файл для чтения в конструкторе и закрывает файл в деструкторе.
#include "mex.hpp" #include "mexAdapter.hpp" #include <fstream> using matlab::mex::ArgumentList; class MexFunction : public matlab::mex::Function { std::ifstream inFile; public: MexFunction() { inFile.open("someTextFile.txt"); } ~MexFunction() { inFile.close(); } void operator()(ArgumentList outputs, ArgumentList inputs) { .... } };
Для получения примера смотрите Управление внешними ресурсами из MEX-функций.
matlab::data::Array
| matlab::data::TypedArray