主要内容

创建C源MEX文件

这个例子展示了如何编写一个MEX文件来调用C函数ArrayProduct.在matlab.®使用定义的MATLAB阵列矩阵C API.您可以查看完整的源文件在这里

要使用此示例,您需要:

如果要使用自己的C开发环境,请参阅使用MEX脚本选项自定义构建想要查询更多的信息。

C功能ArrayProduct.

以下代码定义了ArrayProduct.函数,它乘以一个1xn矩阵y通过标量值X并返回数组的结果Z..您可以在C ++应用程序中使用这些相同的c语句。

void ArrayProduct(双x,双* y,double * z,int n){int i;for(i = 0; i 
            

创建源文件

打开MATLAB编辑器,创建文件,并使用以下信息记录MEX文件。

/ * * ArrayProduct.c  -  MATLAB外部接口的示例* *乘以输入标量(乘法器)*倍1xn矩阵(Inmatrix)*并输出1xn矩阵(Outmatrix)* *呼叫语法是:* * OUTMATRIX = ARRARPRODUCT(乘数,Inmatrix)* *这是MATLAB的MEX文件。* /

添加C / C ++头文件,mex.h,包含MATLAB API函数声明。

# include“mex.h”

将文件保存在MATLAB路径中,例如C:\工作,并命名它ArrayProduct.c..您的MEX文件的名称是ArrayProduct.

创建网关例程

每个C程序都有一个main ()功能。Matlab使用网关例程,mexFunction,作为函数的入口点。添加以下内容mexFunction代码。

/* gateway函数*/ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){/*这里的变量声明*/ /*这里的代码*/}

此表介绍了输入参数mexFunction

范围 描述
nlhs 输出(左边)参数的数量,或普鲁斯大批。
普鲁斯 输出参数数组。
nrhs 输入(右侧)参数的数量或尺寸普尔大批。
普尔 输入参数数组。

验证MEX文件输入和输出参数

验证MEX文件输入的数量和使用的MEX文件输入和输出参数nrhsnlhs参数。

要检查两个输入参数,乘数Inmatrix.,使用此代码。

if(nrhs!= 2){mexerrmsgidandtxt(“MyToolbox:ArrayProduct:NRHS”,“需要两个输入”。);}

使用此代码检查一个输出参数,产品外出

if(nlhs!= 1){mexerrmsgidandtxt(“mytoolbox:ArrayProduct:NLHS”,“需要一个输出”。);}

方法验证参数类型普鲁斯普尔参数。此代码验证了乘数,由PRHS [0],是标量。

/*确保第一个输入参数是标量*/ if(!mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) || mxGetNumberOfElements(prhs[0]) != 1) {mexrmsgidandtxt ("MyToolbox:arrayProduct:notScalar", " input multiplier must be a scalar.");}

此代码验证了Inmatrix.,由PRHS [1],是类型双倍的

if(!mxisdouble(prhs [1])|| mxiscomplex(prhs [1])){mexerrmsgidandtxt(“MyToolbox:ArrayProduct:NotDouble”,“输入矩阵必须类型双倍”。);}

验证Inmatrix.是一排矢量。

/*检查第二个输入参数的行数为1 */ if(mxGetM(prhs[1]) != 1) {mexrmsgidandtxt ("MyToolbox:arrayProduct:notRowVector", " input must be a row vector.");}

创建计算例程

添加ArrayProduct.代码。这个功能是你的计算程序,执行要在MATLAB中使用的功能的源代码。

void ArrayProduct(双x,双* y,double * z,int n){int i;for(i = 0; i 
            

计算例程是可选的。或者,您可以将代码放在mexFunction功能块。

编写跨平台灵活性的代码

Matlab提供预处理器宏,MWSIZE.,表示基于平台的整数大小值。计算例程将数组的大小声明为int.取代int声明为变量N一世MWSIZE.

void ArrayProduct(双x,双* y,双* z,mwsize n){mwsize i;for(i = 0; i 
            

为计算例程声明变量

放入以下变量声明mexFunction

  • 为输入参数声明变量。

    双倍增;/* input scalar */ double *inMatrix;/* 1xN输入矩阵*/
  • 宣布尼尔斯对于输入矩阵的大小。

    mwSize ncols;/*矩阵的大小*/
  • 声明输出参数,外出

    双人*外出;/ *输出矩阵* /

后来你分配了mexFunction变量的参数。

读取输入数据

要读取标量输入,请使用mxGetScalar功能。

/*获取标量输入的值*/ multiplier = mxGetScalar(prhs[0]);

使用mxgetdoubles.函数指向输入矩阵数据。

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

使用mxgetn.函数得到矩阵的大小。

/ *获取输入矩阵* / ncols = mxgetn的尺寸(PRHS [1]);

准备输出数据

要创建输出参数,PLHS [0], 使用mxcreatedoublematrix.功能。

/*创建输出矩阵*/ plhs[0] = mxCreateDoubleMatrix(1,ncols,mxREAL);

使用mxgetdoubles.分配的功能外出参数PLHS [0]

/ *获取输出矩阵* / outmatrix = mxgetdoubles中的实际数据的指针(PLHS [0]);

执行计算

将参数传递给ArrayProduct.

/*调用计算例程*/ arrayProduct(multiplier,inMatrix,outMatrix,ncols);

查看完整源文件

将您的源文件与ArrayProduct.c.位于matlabroot/ extern / simem / mex.打开文件ArrayProduct.c.在编辑器中。

对于使用C ++ MEX文件示例MATLAB数据API., 看arrayProduct.cpp.有关使用此API创建MEX文件的信息,请参阅C ++ MEX功能

构建墨西哥人的功能

在MATLAB命令提示符下,使用墨西哥人命令。

墨西哥人ArrayProduct.c.-R2018A

测试MEX功能

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

验证MEX文件输入参数

在调用MEX函数之前,验证Matlab变量的类型是好的做法。要测试输入变量,Inpannarg.,并将其转换为双倍的如有必要,请使用此代码。

s = 5;A = [1.5, 2, 9];inputArg = int16(一个);如果~ strcmp(类(inputArg),'双倍的')Inputarg = Double(Inputarg);结尾B = arrayProduct(年代,inputArg)

也可以看看

||||||

相关的话题