主要内容

在C MEX文件中处理复杂数据

这个例子convec.c取两个复行向量并卷积它们。MEX文件使用C Matrix API中的函数。

创建源文件

下面的语句说明了MEX函数。

/*========================================================= * convec.c *例子通过复杂的数据从MATLAB和C * *可变两个复杂的输入向量* *这是一个MEX-file MATLAB。* 1984 - 2017版权MathWorks公司 . *=======================================================*/

创建网关例程,验证输入和输出参数

下面的语句添加了C/ c++头文件mex.h和创建mexFunction入口点。

#include "mex.h" /*网关例程。*/ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {return;}

下面的语句验证参数的数量。

/*检查正确的参数数量*/ if(nrhs != 2) mexrrmsgidandtxt ("MATLAB: convert:invalidNumInputs", "Two inputs required.");如果(nlhs > 1) mexrrmsgidandtxt ("MATLAB: convert:maxlhs", "太多输出参数");

下面的语句验证输入参数是否为行向量。

/*检查两个输入都是行向量*/ if(mxGetM(prhs[0]) != 1 || mxGetM(prhs[1]) != 1) mexrmsgidandtxt ("MATLAB: convert:inputsNotVectors", "两个输入必须是行向量");

下面的语句验证输入参数是否复杂。

/*检查两个输入都是复数*/ if(!mxIsComplex(prhs[0]) || !mxIsComplex(prhs[1])) mexrmsgidandtxt ("MATLAB: convert:inputsNotComplex", " input must be complex.\n");

创建输出mxArray

以下语句定义了用于创建输出的参数mxArray

size_t行,关口;size_t nx、纽约;/*获取每个输入向量的长度*/ nx = mxGetN(prhs[0]);纽约= mxGetN (prhs [1]);行= 1;Cols = nx + ny - 1;

下面的语句创建一个数组并设置输出指针plhs [0]到它。

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

创建计算程序

下面的语句定义convec,计算程序。

void convc (mxArray * x, mxArray * y, mxArray * z, size_t nx, size_t ny) {mxArray i,j; / /数组大小/*获取指向复杂数组的指针*/ mxComplexDouble */ xc = mxgetcomplexdouble (x);mxComplexDouble * yc = mxgetcomplexdouble (y); / /将双精度计算mxComplexDouble * zc = mxgetcomplexdouble (z);佐[0]。真正的= 0;佐[0]。图像放大= 0;/*执行复向量的卷积*/ for(i=0;我< nx; i++) { for(j=0; j
            

调用convec

下面的语句调用计算例程。

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

构建和测试

在MATLAB®命令提示符类型:

墨西哥人-R2018aconvec.c

测试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 * Column 1 to 4 0.1800 - 0.2600i 0.9600 + 0.2800i 1.3200 - 1.4400i 3.7600 - 0.1200i Column 5 1.5400 - 4.1400i

将结果与MATLAB内置函数进行比较conv

conv (x, y)

另请参阅

相关的话题