这个例子展示了如何编写一个MEX文件来调用C函数ArrayProduct.
在matlab.®使用定义的MATLAB阵列矩阵C API.您可以查看完整的源文件在这里.
要使用此示例,您需要:
能够编写C或c++源代码。您可以使用MATLAB编辑器创建这些文件。
MATLAB支持的万博1manbetx编译器。有关支持的编译器的最新列表,请参阅万博1manbetx万博1manbetx支持和兼容编译器网站。
墨西哥人
构建脚本。
如果要使用自己的C开发环境,请参阅使用MEX脚本选项自定义构建想要查询更多的信息。
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文件输入和输出参数nrhs
和nlhs
参数。
要检查两个输入参数,乘数
和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 / mexArrayProduct.c.
在编辑器中。
对于使用C ++ MEX文件示例MATLAB数据API., 看arrayProduct.cpp
.有关使用此API创建MEX文件的信息,请参阅C ++ MEX功能.
在MATLAB命令提示符下,使用墨西哥人
命令。
墨西哥人ArrayProduct.c.-R2018A
s = 5;A = [1.5, 2, 9];B = arrayProduct(年代)
B = 7.5000 10.0000 45.0000
在调用MEX函数之前,验证Matlab变量的类型是好的做法。要测试输入变量,Inpannarg.
,并将其转换为双倍的
如有必要,请使用此代码。
s = 5;A = [1.5, 2, 9];inputArg = int16(一个);如果~ strcmp(类(inputArg),'双倍的')Inputarg = Double(Inputarg);结尾B = arrayProduct(年代,inputArg)
墨西哥人
|mexFunction
|MWSIZE.
|mxGetScalar
|mxgetdoubles.
|mxgetn.
|mxcreatedoublematrix.