Структура MEX-функции C++

Дизайн MEX-функции

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-функций.

Смотрите также

|

Похожие темы

Была ли эта тема полезной?