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