Создание исходного файла MEX на C

В этом примере показано, как записать, что файл MEX, чтобы вызвать C функционирует arrayProduct в MATLAB® с помощью массива MATLAB задан в Матричном API C. Можно просмотреть полный исходный файл здесь.

Чтобы использовать этот пример, вам нужно:

Если вы хотите использовать свою собственную среду разработки C, смотрите Сделанный на заказ с Опциями Скрипта MEX для получения дополнительной информации.

C функционируют arrayProduct

Следующий код задает arrayProduct функция, которая умножается 1xn матричный y скалярным значением x и возвращает результаты в массив z. Можно использовать эти те же операторы C в приложении C++.

void arrayProduct(double x, double *y, double *z, int n)
{
  int i;
  
  for (i=0; i<n; i++) {
    z[i] = x * y[i];
  }
}

Создание файла исходного кода

Открытый редактор MATLAB, создайте файл и зарегистрируйте файл MEX со следующей информацией.

/*
 * arrayProduct.c - example in MATLAB External Interfaces
 *
 * Multiplies an input scalar (multiplier) 
 * times a 1xN matrix (inMatrix)
 * and outputs a 1xN matrix (outMatrix)
 *
 * The calling syntax is:
 *
 *		outMatrix = arrayProduct(multiplier, inMatrix)
 *
 * This is a MEX file for MATLAB.
*/

Добавьте заголовочный файл C/C++, mex.h, содержа объявления функции MATLAB API.

#include "mex.h"

Сохраните файл на своем пути MATLAB, например, в c:\work, и назовите его arrayProduct.c. Именем вашего файла MEX является arrayProduct.

Создание стандартной программы шлюза

Каждая программа C имеет main() функция. MATLAB использует стандартную программу шлюза, mexFunction, как точка входа к функции. Добавьте следующий mexFunction код.

/* The gateway function */
void mexFunction(int nlhs, mxArray *plhs[],
                 int nrhs, const mxArray *prhs[])
{
/* variable declarations here */

/* code here */
}

Эта таблица описывает входные параметры для mexFunction.

ПараметрОписание
nlhsКоличество выхода (левая сторона) аргументы или размер plhs массив.
plhsМассив выходных аргументов.
nrhsКоличество входа (правая сторона) аргументы или размер prhs массив.
prhsМассив входных параметров.

Верификация ввода MEX-файла и выходные параметры

Проверьте количество аргументов ввода и вывода файла MEX с помощью nrhs и nlhs аргументы.

Проверять на два входных параметра, multiplier и inMatrix, используйте этот код.

if(nrhs != 2) {
    mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nrhs",
                      "Two inputs required.");
}

Используйте этот код, чтобы проверять на один выходной аргумент, продукт outMatrix.

if(nlhs != 1) {
    mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nlhs",
                      "One output required.");
}

Проверьте типы аргумента с помощью plhs и prhs аргументы. Этот код подтверждает тот multiplier, представленный prhs[0], скаляр.

/* make sure the first input argument is scalar */
if( !mxIsDouble(prhs[0]) || 
     mxIsComplex(prhs[0]) ||
     mxGetNumberOfElements(prhs[0]) != 1 ) {
    mexErrMsgIdAndTxt("MyToolbox:arrayProduct:notScalar",
                      "Input multiplier must be a scalar.");
}

Этот код подтверждает тот inMatrix, представленный prhs[1], тип double.

if( !mxIsDouble(prhs[1]) || 
     mxIsComplex(prhs[1])) {
    mexErrMsgIdAndTxt("MyToolbox:arrayProduct:notDouble",
        "Input matrix must be type double.");
}

Подтвердите тот inMatrix вектор-строка.

/* check that number of rows in second input argument is 1 */
if(mxGetM(prhs[1]) != 1) {
    mexErrMsgIdAndTxt("MyToolbox:arrayProduct:notRowVector",
                      "Input must be a row vector.");
}

Создание стандартной программы вычислительных операций

Добавьте arrayProduct код. Эта функция является вашей вычислительной процедурой, исходный код, который выполняет функциональность, которую вы хотите использовать в MATLAB.

void arrayProduct(double x, double *y, double *z, int n)
{
  int i;
  
  for (i=0; i<n; i++) {
    z[i] = x * y[i];
  }
}

Вычислительная процедура является дополнительной. В качестве альтернативы можно поместить код в mexFunction функциональный блок.

Запись кода для кросс-платформенной гибкости

MATLAB обеспечивает макрос препроцессора, mwsize, это представляет значения размера для целых чисел, на основе платформы. Вычислительная процедура объявляет размер массива как int. Замените int объявление для переменных n и i с mwsize.

void arrayProduct(double x, double *y, double *z, mwSize n)
{
  mwSize i;
  
  for (i=0; i<n; i++) {
    z[i] = x * y[i];
  }
}

Объявление переменных для вычислительной процедуры

Поместите следующие объявления переменной в mexFunction.

  • Объявите переменные для входных параметров.

    double multiplier;      /* input scalar */
    double *inMatrix;       /* 1xN input matrix */
    
  • Объявите ncols для размера входной матрицы.

    mwSize ncols;           /* size of matrix */
    
  • Объявите выходной аргумент, outMatrix.

    double *outMatrix;      /* output matrix */
    

Позже вы присваиваете mexFunction аргументы к этим переменным.

Чтение входных данных

Чтобы считать скалярный вход, используйте mxGetScalar функция.

/* get the value of the scalar input  */
multiplier = mxGetScalar(prhs[0]);

Используйте mxGetDoubles функционируйте, чтобы указать на входные матричные данные.

/* create a pointer to the real data in the input matrix  */
inMatrix = mxGetDoubles(prhs[1]);

Используйте mxGetN функция, чтобы получить размер матрицы.

/* get dimensions of the input matrix */
ncols = mxGetN(prhs[1]);

Подготовка выходных данных

Задать выходной аргумент, plhs[0], используйте mxCreateDoubleMatrix функция.

/* create the output matrix */
plhs[0] = mxCreateDoubleMatrix(1,ncols,mxREAL);

Используйте mxGetDoubles функционируйте, чтобы присвоить outMatrix аргумент к plhs[0]

/* get a pointer to the real data in the output matrix */
outMatrix = mxGetDoubles(plhs[0]);

Выполнение вычислений

Передайте аргументы arrayProduct.

/* call the computational routine */
arrayProduct(multiplier,inMatrix,outMatrix,ncols);

Просмотр всего файла исходного кода

Сравните свой исходный файл с arrayProduct.c расположенный в matlabroot/extern/examples/mex. Откройте файл arrayProduct.c в редакторе.

Для примера файла MEX C++ с помощью MATLAB Data API смотрите arrayProduct.cpp. Для получения информации о создании файлов MEX с этим API смотрите MEX-функции C++.

Создайте MEX-функцию

В командной строке MATLAB создайте функцию с mex команда.

mex arrayProduct.c -R2018a

Протестируйте MEX-функцию

s = 5; 
A = [1.5, 2, 9];
B = arrayProduct(s,A)
B =
    7.5000   10.0000   45.0000 

Проверка входных параметров файла MEX

Это - хорошая практика, чтобы подтвердить тип переменной MATLAB прежде, чем вызвать MEX-функцию. Протестировать входную переменную, inputArg, и преобразуйте его в double при необходимости используйте этот код.

s = 5; 
A = [1.5, 2, 9];
inputArg = int16(A);
if ~strcmp(class(inputArg),'double')
    inputArg = double(inputArg);
end
B = arrayProduct(s,inputArg)

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

| | | | | |

Похожие темы