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