Стандартная программа шлюза является точкой входа к файлу MEX. Именно через эту стандартную программу остальная часть доступов MATLAB® стандартных программ в ваших файлах MEX. Именем стандартной программы шлюза является mexFunction
. Это занимает место функции main
в вашем исходном коде.
Имя исходного файла, содержащего mexFunction
, является именем вашего файла MEX, и, следовательно, именем функции, которое вы вызываете в MATLAB.
Расширение файла бинарного файла MEX зависимо платформой. Вы находите расширение файла с помощью функции mexext
, которая возвращает значение для текущей машины.
Подпись для mexFunction
:
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
Поместите эту функцию после своей вычислительной процедуры и любых других функций в вашем исходном файле.
Следующая таблица описывает параметры для mexFunction
.
Параметр | Описание |
---|---|
prhs | Массив входных параметров правой стороны. |
plhs | Массив выходных аргументов левой стороны. |
nrhs | Количество аргументов правой стороны или размер массива prhs . |
nlhs | Количество аргументов левой стороны или размер массива plhs . |
Объявите prhs
и plhs
как тип mxArray *
, что означает, что они указывают на массивы MATLAB. Они - векторы, которые содержат указатели на аргументы файла MEX. Ключевое слово const
, который изменяет prhs
, означает, что ваш файл MEX не изменяет входные параметры.
Можно думать об имени prhs
как представление “параметров, правой стороны”, то есть, входных параметров. Аналогично, plhs
представляет “параметры, левая сторона” или выходные параметры.
Введите параметры (найденный в массиве prhs
), только для чтения; не изменяйте их в своем файле MEX. Изменение данных во входном параметре может произвести нежелательные побочные эффекты.
Также необходимо заботиться при использовании входного параметра, чтобы создать выходные данные или любые данные, используемые локально в файле MEX. Чтобы скопировать входной массив в локально определенную переменную, myData
, вызывают функцию mxDuplicateArray
, чтобы сделать из копии входного массива. Например:
mxArray *myData = mxCreateStructMatrix(1,1,nfields,fnames); mxSetField(myData,0,"myFieldName",mxDuplicateArray(prhs[0]));
Для получения дополнительной информации смотрите тему поиска и устранения неисправностей, Неправильно Создающую Ячейку или Структуру mxArray.
Для списка функций, чтобы подтвердить входные параметры к вашим функциям, смотрите Матричную категорию API, Валидацию данных.
Функция mxIsClass
является способом общего назначения протестировать mxArray
. Например, предположите, что ваш второй входной параметр (идентифицированный prhs[1]
) должен быть полной матрицей вещественных чисел. Чтобы проверить это условие, используйте следующие операторы.
if(mxIsSparse(prhs[1]) || mxIsComplex(prhs[1]) || mxIsClass(prhs[1],"char")) { mexErrMsgIdAndTxt("MyToolbox:myfnc:nrhs", "input2 must be full matrix of real values."); }
Этим примером не является исчерпывающая проверка. Можно также протестировать на структуры, массивы ячеек, указатели на функцию и объекты MATLAB.
Вычислительная процедура содержит код для выполнения вычислений, которые вы хотите реализованный в бинарном файле MEX. Несмотря на то, что не требуемый, полагайте, что запись стандартной программы шлюза, mexFunction
, вызывает вычислительную процедуру. Используйте код mexFunction
в качестве обертки, чтобы подтвердить входные параметры и преобразовать их в типы, требуемые вычислительной процедурой.
Если вы пишете отдельный шлюз и вычислительные процедуры, можно объединить их в один исходный файл или в отдельные файлы. При использовании отдельные файлы, файл, содержащий mexFunction
, должен быть первым исходным файлом, перечисленным в команде mex
.
mATLAB:: mEX:: ArgumentList
| mATLAB:: mEX:: Функция
| mexFunction
| mexext
| mxDuplicateArray
| mxIsClass