MEX API на C++ предоставляет функции, которые позволяют вам обращаться и проверять аргументы. Оба matlab::mex::ArgumentList
и matlab::data::Array
задайте функции, которые полезны для выполнения проверок аргументов, переданных в MEX-функцию. The 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
с этими аргументами:
The 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")})); }
The 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")})); } }