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.

Manejar datos complejos

Este ejemplo convec.c toma dos vectores de fila complejos y los convoluciona. El ejemplo asume una comprensión básica de los archivos MEX como se describe en.Crear archivo MEX fuente C

Crear archivo de código fuente

Las siguientes instrucciones documentan la función MEX.

/*=========================================================  * convec.c  * example for passing complex data from MATLAB to C and back again  *  * convolves  two complex input vectors  *  * This is a MEX-file for MATLAB.  * Copyright 1984-2017 The MathWorks, Inc.  *=======================================================*/ 

Crear rutina de pasarela y verificar parámetros de entrada y salida

Las siguientes instrucciones agregan el archivo de encabezado C/C++ y crean el punto de entrada.mex.hmexFunction

#include "mex.h"  /* The gateway routine. */ void mexFunction( int nlhs, mxArray *plhs[],                   int nrhs, const mxArray *prhs[] ) {     return; } 

Las siguientes instrucciones validan el número de parámetros.

    /* check for the proper number of arguments */     if(nrhs != 2)       mexErrMsgIdAndTxt( "MATLAB:convec:invalidNumInputs",               "Two inputs required.");     if(nlhs > 1)       mexErrMsgIdAndTxt( "MATLAB:convec:maxlhs",               "Too many output arguments."); 

La siguiente instrucción comprueba que los argumentos de entrada son vectores de fila.

    /*Check that both inputs are row vectors*/     if( mxGetM(prhs[0]) != 1 || mxGetM(prhs[1]) != 1 )       mexErrMsgIdAndTxt( "MATLAB:convec:inputsNotVectors",               "Both inputs must be row vectors."); 

La siguiente instrucción comprueba que los argumentos de entrada son complejos.

    /* Check that both inputs are complex*/     if( !mxIsComplex(prhs[0]) || !mxIsComplex(prhs[1]) )       mexErrMsgIdAndTxt( "MATLAB:convec:inputsNotComplex",               "Inputs must be complex.\n"); 

Crear salidamxArray

Las siguientes instrucciones definen los parámetros para crear la salida.mxArray

    size_t rows, cols;     size_t nx, ny;      /* get the length of each input vector */     nx = mxGetN(prhs[0]);     ny = mxGetN(prhs[1]);      rows = 1;      cols = nx + ny - 1; 

La siguiente instrucción crea una matriz y establece el puntero de salida en ella.plhs[0]

    plhs[0] = mxCreateDoubleMatrix( (mwSize)rows, (mwSize)cols, mxCOMPLEX); 

Crear rutina computacional

Las siguientes instrucciones definen la rutina computacional.convec

void convec(mxArray * x, mxArray * y, mxArray * z,             size_t nx, size_t ny) {     mwSize i,j;      /* get pointers to the complex arrays */     mxComplexDouble * xc = mxGetComplexDoubles(x);     mxComplexDouble * yc = mxGetComplexDoubles(y);     mxComplexDouble * zc = mxGetComplexDoubles(z);     zc[0].real = 0;     zc[0].imag = 0;     /* perform the convolution of the complex vectors */     for(i=0; i<nx; i++) {         for(j=0; j<ny; j++) {             zc[i+j].real =             zc[i+j].real + xc[i].real * yc[j].real - xc[i].imag * yc[j].imag;              zc[i+j].imag =             zc[i+j].imag + xc[i].real * yc[j].imag + xc[i].imag * yc[j].real;         }     } } 

Llamarconvec

La siguiente instrucción llama a la rutina computacional.

    convec(prhs[0], prhs[1], plhs[0], nx, ny); 

Compile y pruebe

En el tipo de símbolo del sistema:MATLAB®

mex -R2018a convec.c

Pruebe el archivo MEX.

x = [3.000 - 1.000i, 4.000 + 2.000i, 7.000 - 3.000i]; y = [8.000 - 6.000i, 12.000 + 16.000i, 40.000 - 42.000i]; z = convec(x,y)
z =    1.0e+02 *  Columns 1 through 4   0.1800 - 0.2600i 0.9600 + 0.2800i 1.3200 - 1.4400i 3.7600 - 0.1200i  Column 5   1.5400 - 4.1400i

Compare los resultados con la función incorporada.MATLABconv

conv(x,y)

Consulte también

Temas relacionados