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")})); }
Контейнер 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")})); } }