Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Crear archivo MEX fuente C

Este ejemplo muestra cómo escribir un archivo MEX para llamar a una función de C en el uso de una matriz definida en el.arrayProductMATLAB®MATLABAPI para manipular matrices en C Puede ver el archivo de código fuente completo.Aquí

En este ejemplo se utiliza el editor para escribir el código fuente y el comando para crear la función MEX.MATLABMATLABmex Los requisitos para la creación de archivos MEX se enumeran en. Si desea utilizar su propio entorno de desarrollo de C, consulte para obtener más información.Custom Build con opciones de script MEX

Función CarrayProduct

El código siguiente define la función, que multiplica una matriz 1xN por un valor escalar y devuelve los resultados en array.arrayProductyxz Puede usar estas mismas instrucciones de C en una aplicación de C++.

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

Crear archivo de código fuente

Abra el editor, cree un archivo y documente el archivo MEX con la siguiente información.MATLAB

/*  * 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. */ 

Agregue el archivo de encabezado C/C++, que contiene las declaraciones de la función de API.mex.hMATLAB

#include "mex.h"

Guarde el archivo en la ruta de acceso, por ejemplo, en y asigne un nombre.MATLABc:\workarrayProduct.c El nombre de su archivo MEX es.arrayProduct

Crear rutina de pasarela

Cada programa C tiene una función. utiliza la rutina de pasarela, como punto de entrada a la función.main()MATLABmexFunction Agregue el código siguiente.mexFunction

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

Esta tabla describe los parámetros de entrada para.mexFunction

ParámetroDescripción
nlhsNúmero de argumentos de salida (lado izquierdo) o del tamaño de la matriz.plhs
plhsMatriz de argumentos de salida.
nrhsNúmero de argumentos de entrada (del lado derecho) o del tamaño de la matriz.prhs
prhsMatriz de argumentos de entrada.

Verifique los parámetros de entrada y salida del archivo MEX

Compruebe el número de argumentos de entrada y salida de archivo MEX mediante los argumentos y.nrhsnlhs

Para comprobar si hay dos argumentos de entrada y, utilice este código.multiplierinMatrix

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

Utilice este código para comprobar si hay un argumento de salida, el producto.outMatrix

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

Compruebe los tipos de argumento mediante los argumentos y.plhsprhs Este código valida que, representado por, es un escalar.multiplierprhs[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."); } 

Este código valida que, representado por, es Type.inMatrixprhs[1]double

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

Valide que es un vector de fila.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."); }

Crear rutina computacional

Agregue el código.arrayProduct Esta función es su, el código fuente que realiza la funcionalidad que desea utilizar en.rutina computacionalMATLAB

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

Una rutina computacional es opcional. Alternativamente, puede colocar el código dentro del bloque de función.mexFunction

Escriba código para la flexibilidad multiplataforma

proporciona una macro de preprocesador, que representa los valores de tamaño de los enteros, en función de la plataforma.MATLABmwsize La rutina computacional declara el tamaño de la matriz como.int Reemplace la declaración de variables y con.intnimwsize

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

Declare variables para la rutina computacional

Coloque las siguientes declaraciones de variable en.mexFunction

  • Declare variables para los argumentos de entrada.

    double multiplier;      /* input scalar */ double *inMatrix;       /* 1xN input matrix */ 
  • Declare el tamaño de la matriz de entrada.ncols

    mwSize ncols;           /* size of matrix */ 
  • Declare el argumento de salida,.outMatrix

    double *outMatrix;      /* output matrix */ 

Más adelante se asignan los argumentos a estas variables.mexFunction

Leer datos de entrada

Para leer la entrada escalar, utilice la función.mxGetScalar

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

Utilice la función para apuntar a los datos de la matriz de entrada.mxGetDoubles

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

Utilice la función para obtener el tamaño de la matriz.mxGetN

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

Preparar datos de salida

Para crear el argumento de salida, utilice la función.plhs[0]mxCreateDoubleMatrix

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

Utilice la función para asignar el argumento amxGetDoublesoutMatrixplhs[0]

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

Realice el cálculo

Pase los argumentos a.arrayProduct

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

Ver archivo de código fuente completo

Compare su archivo de origen con el que se encuentra enarrayProduct.c matlabroot/extern/examples/mex. Abra el archivo arrayProduct.c en el editor.

Para un ejemplo de archivo MEX de C++ usando el, veaAPI de datos de MATLAB arrayProduct.cpp. Para obtener información sobre la creación de archivos MEX con esta API, consulte.Funciones MEX de C++

Construir función MEX

En la solicitud de comando, compile la función con el comando.MATLABmex

mex arrayProduct.c -R2018a

Pruebe la función MEX

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

Validar argumentos de entrada de archivo MEX

Es una buena práctica validar el tipo de una variable antes de llamar a una función MEX.MATLAB Para probar la variable de entrada y convertirla en si es necesario, utilice este código.inputArgdouble

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

Consulte también

| | | | | |

Temas relacionados