MEX-функция C++ является классом, который заменяет оператор вызова функции, operator()
создать функциональный объект или функтор. Эти объекты ведут себя как функции MATLAB®, которые могут принять входные параметры и возвратить выходные параметры.
Включайте эти заголовочные файлы:
mex.hpp
— Включайте этот файл для API C++ MEX.
mexAdapter.hpp
— Включайте этот файл однажды для реализации MexFunction
класс
API C++ MEX содержатся в этих пространствах имен:
matlab::mex
— Интерфейс MEX
matlab::data
MATLAB Data API
matlab::engine
— Engine API для C++
Задайте MEX-функцию C++ как класс под названием MexFunction
это выводит из matlab::mex::Function
класс. 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