这个例子展示了如何编写一个传递标量值的MEX文件。
假设你有以下的C代码,timestwo
,它的输入是标量a1
——- - - - - -1
矩阵,翻倍。
Void timesttwo (double y[], double x[]) {y[0] = 2.0*x[0];返回;}
C代码分析
要查看作为MEX文件编写的函数,请打开timestwo.c
在MATLAB®编辑器。
在C/ c++中,编译器检查函数实参的数量和类型。然而,在MATLAB中,您可以向函数传递任意数量或类型的参数;函数负责检查参数。MEX文件还允许可变输入。MEX文件必须安全地处理任意数量的受支持类型的输入或输出参数。金宝app
这段代码检查参数的正确数量。
if(nrhs != 1) {mexrrmsgidandtxt ("MATLAB: timesttwo:invalidNumInputs", "One input required.");} else if(nlhs>1) {mexrrmsgidandtxt ("MATLAB: timesttwo:maxlhs", "输出参数太多");}
这段代码检查输入是否为实的标量双精度值。
mrows = mxGetM (prhs [0]);ncols = mxGetN (prhs [0]);if(!mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) || !(mrows==1 && ncols==1)) {mexrmsgidandtxt ("MATLAB: timesttwo:inputNotRealScalarDouble", "Input must be a noncomplex scalar double.");}
构建和测试示例
构建MEX文件。
墨西哥人- v-R2018atimestwo.c
调用的函数。
x = 2;y = timestwo (x)
y = 4
这个例子展示了如何编写一个MEX文件,它通过值传递一个标量。
的mxGetScalar
函数返回标量的值,而不是指向标量变量副本的指针,x
.
下面的C代码实现了timestwo_alt
函数。
Void timestwo_alt(double *y, double x) {*y = 2.0*x;}
比较timestwo_alt
函数签名timestwo
函数签名。
Void timestwo_alt(double *y, double x)
Void timesttwo (double y[], double x[])
输入值x
是类型标量吗双
.在timestwo
函数时,输入值是一个矩阵类型双
.
要查看作为MEX文件编写的函数,请打开timestwoalt.c
在MATLAB编辑器中。
将调用与timestwo_alt
响应号召timestwo
.
/*获取输入x的标量值*/ /*注意:mxGetScalar返回一个值,而不是指针*/ x = mxGetScalar(prhs[0]);/*指定一个指向输出的指针*/ y = mxgetdouble (plhs[0]);/*调用timestwo_alt子程序*/ timestwo_alt(y,x);
/*为每个输入和输出赋值指针。*/ x = mxgetdouble (prhs[0]);y = mxGetDoubles (plhs [0]);/*调用timetwo子程序。* / timestwo (y、x);
的值x
由mxGetScalar
是标量而不是指针。