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:: функционируют, чтобы вызвать MATLAB error или 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")}));
}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")}));
}
}