exponenta event banner

Обработка входов и выходов

API C++ MEX предоставляет функции, позволяющие получать доступ к аргументам и проверять их правильность. Оба matlab::mex::ArgumentList и matlab::data::Array определить функции, полезные для выполнения проверок аргументов, передаваемых функции MEX. matlab::data::ArrayType класс перечисления позволяет проверять определенные типы входных данных.

Проверка аргумента

В этой таблице представлены функции, полезные для проверки ошибок.

matlab::mex::ArgumentList::size()Определите количество входов. Размер ArgumentList равен числу аргументов, используемых в вызове функции.
matlab::mex::ArgumentList::empty()Проверка на отсутствие входов или выходов. Если функция MEX вызывается без входных или выходных аргументов, то соответствующие ArgumentList аргумент пуст.
matlab::data::Array::getType()Определите тип входного аргумента. Эта функция возвращает matlab::data::ArrayType объект.
matlab::data::Array::getDimensions()Определите размеры массива входных аргументов. Эта функция возвращает matlab::data::ArrayDimensions объект, который определен как std::vector<size_t>.
matlab::data::Array::getNumberOfElements()Определите количество элементов в массиве входных аргументов.
matlab::data::Array::isEmpty()Определите, пуст ли массив входных аргументов.

В этих примерах показано, как проверить значения аргументов в файле MEX и выдать ошибки в MATLAB ® в случае неуспешного завершения тестов. Используйте функцию matlab:: engine:: MATLABEngine:: feval для вызова функции MATLABerror или warning функции.

Звонить feval с этими аргументами:

  • error или warning имя функции, переданное как строка UTF16.

  • Количество возвращаемых аргументов, которое равно нулю в этих примерах.

  • Сообщения, отображаемые с помощью MATLAB error или warning функции. Передача сообщения в std::vector содержащий matlab::data::Array создан с помощью matlab::data::ArrayFactory фабрика.

Звонить feval и определите аргументы, получите указатель на механизм MATLAB и фабрику массива данных MATLAB.

class MexFunction : public matlab::mex::Function {
public:
    void operator()(matlab::mex::ArgumentList outputs, matlab::mex::ArgumentList inputs) {
        std::shared_ptr<matlab::engine::MATLABEngine> matlabPtr = getEngine();
        matlab::data::ArrayFactory factory;
        ...
    }
}

Для файла MEX требуется три входных аргумента.

if (inputs.size() != 3) {
    matlabPtr->feval(u"error", 0,
        std::vector<matlab::data::Array>({ factory.createScalar("Three inputs required") }));
}

Файл MEX требует назначения двух выходных аргументов.

if (outputs.size() != 2) {
    matlabPtr->feval(u"error", 0, 
        std::vector<matlab::data::Array>({ factory.createScalar("Two outputs required") }));
}

Второй входной аргумент должен быть вектором строк 1 на 4, состоящим из некомплексных двойников.

if (inputs[1].getType() != matlab::data::ArrayType::DOUBLE ||
    inputs[1].getType() == matlab::data::ArrayType::COMPLEX_DOUBLE ||
    inputs[1].getNumberOfElements() != 4 || 
    inputs[1].getDimensions()[1] == 1) {
    matlabPtr->feval(u"error", 0, 
       std::vector<matlab::data::Array>({ factory.createScalar("Input must be 4-element row vector")}));
}

Итераторы ArgumentList

matlab::mex::ArgumentList контейнер реализует пару итераторов, которые отмечают начало и конец списка аргументов. Эти итераторы используются для закольцовывания всех входов функции MEX. Например, эта функция MEX суммирует все свои входные данные с использованием диапазона for цикл.

#include "mex.hpp"
#include "mexAdapter.hpp"

class MexFunction : public matlab::mex::Function {
    matlab::data::ArrayFactory factory;
public:
    void operator()(matlab::mex::ArgumentList outputs, matlab::mex::ArgumentList inputs) {
        double sm = 0;
        for (const matlab::data::TypedArray<double>& elem : inputs) {
            sm = sm + elem[0];
        }
        outputs[0] = factory.createScalar(sm);
    };
};

Сохранить этот MEX-файл как sumInputs.cpp и скомпилировать с mex команда. Вызовите функцию с диапазоном аргументов.

mex sumInputs.cpp
sumInputs(1,2,3,4,5,6,7)

ans =

    28

Поддерживаемое переменное число аргументов

Можно поддерживать переменное количество аргументов в функциях MEX, проверяя размер входных и выходных данных. matlab::mex::ArgumentList массив.

В следующем фрагменте кода размер outputs массив параметров указывает, сколько выходов указано при вызове функции MEX. Использование ArgumentList::size этот код определяет количество выходов, указанных при вызове функции MEX.

void operator()(matlab::mex::ArgumentList outputs, matlab::mex::ArgumentList inputs) {

    if (outputs.size() == 3) {
        outputs[0] = // Assign first output
        outputs[1] = // Assign second output
        outputs[2] = // Assign third output
    }
    else if (outputs.size() == 1) {
        outputs[0] = // Assign only one output
    }
    else {
        matlabPtr->feval(u"error", 0, 
            std::vector<matlab::data::Array>({ factory.createScalar("One or three outputs required")}));
    }
}

См. также

Связанные темы