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

В этом примере показано, как записать файл MEX для вызова функции C arrayProduct в MATLAB® использование массива MATLAB, заданного в Matrix API на C. Полный исходный файл можно просмотреть здесь.

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

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

Функциональные arrayProduct C

Следующий код определяет 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)

См. также

| | | | | |

Похожие темы