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

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:: механизм:: MATLABEngine:: функционируют, чтобы вызвать error MATLAB или функции warning.

Вызовите feval с этими аргументами:

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

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

  • Сообщения, чтобы отобразиться с error MATLAB или функциями 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 thrid 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")}));
    }
}

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

Похожие темы