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

Проект MEX-функций

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

См. также

|

Похожие темы