从以下C函数生成MEX文件时遇到一些问题:
#include <math.h>
#include <mex.h>
void mexFunction(int nlhs, mxArray *plhs[], /* Output variables */
int nrhs, const mxArray *prhs[]) /* Input variables */
{
#define y plhs[0]
#define x prhs[0]
double y, x, p;
int Y, X;
mexPrintf ("x = %d",x);
if(nrhs < 1 or nrhs > 2) /* Check the number of arguments */
mexErrMsgTxt("Wrong number of input arguments.");
else if(nlhs > 1)
mexErrMsgTxt("Too many output arguments.");
if(nrhs == 1) /* If p is unspecified, set it to a default value */
c = 3.0;
y=c*x*x;
X=mxIsDouble(x);
Y=mxIsDouble(y);
mexPrintf ("the value for y is %d",Y);
}
我做了很多研究,但我似乎仍然无法得到这个概念。我的任务就是生成一个MEX文件,在matlab中输入x时可以生成y = 3x ^ 2。 我将文件保存为quadratic.c。当我输入
`mex quadratic.c`
在matlab命令中,我得到:
quadratic.c quadratic.c(15) : error C2143: syntax error : missing ';' before 'type' quadratic.c(15) : error C2143: syntax error : missing ';' before ',' quadratic.c(15) : error C2143: syntax error : missing ';' before ',' quadratic.c(16) : error C2143: syntax error : missing ';' before 'type' quadratic.c(18) : error C2143: syntax error : missing ')' before ';' quadratic.c(18) : error C2059: syntax error : ')' quadratic.c(19) : error C2146: syntax error : missing ')' before identifier 'or' quadratic.c(19) : error C2065: 'or' : undeclared identifier quadratic.c(19) : error C2146: syntax error : missing ';' before identifier 'nrhs' quadratic.c(19) : error C2059: syntax error : ')' quadratic.c(19) : error C2143: syntax error : missing ';' before '{' quadratic.c(19) : warning C4552: '>' : operator has no effect; expected operator with side-effect quadratic.c(21) : error C2181: illegal else without matching if quadratic.c(25) : error C2065: 'c' : undeclared identifier quadratic.c(25) : warning C4244: '=' : conversion from 'double' to 'int', possible loss of data quadratic.c(27) : error C2143: syntax error : missing ';' before '=' quadratic.c(29) : error C2065: 'X' : undeclared identifier quadratic.c(29) : error C2143: syntax error : missing ')' before ';' quadratic.c(29) : error C2059: syntax error : ')' quadratic.c(30) : error C2065: 'Y' : undeclared identifier quadratic.c(30) : error C2143: syntax error : missing ')' before ';' quadratic.c(30) : error C2059: syntax error : ')' quadratic.c(33) : error C2065: 'Y' : undeclared identifier C:\PROGRA~1\MATLAB\R2013A\BIN\MEX.PL: Error: Compile of 'quadratic.c' failed.
我不知道该怎么办。我确定我做错了但我无法弄明白。
答案 0 :(得分:3)
11,12
中您已将x,y
定义为函数的输出和输入
11: #define y plhs[0]
12: #define x prhs[0]
但在15,16
行中,您已将x,y
定义为double
类型的变量
15: double y, x, p;
16: int Y, X;
您应该更改行11,12
中的变量名称或行15,16
中的变量名称,以使它们不同,因为正如您编写的11: #define y plhs[0]
一样,每个y
都在程序实际上由编译器替换为plhs[0]
,这是指向Matlab输出数据的指针。
因此,如果您已经替换double x
double xVal
,请先访问第18行的值,您应首先从prhs[0]
18: mexPrintf ("x = %d",x);
所以你应该在第18行之前写这个:
xVal = mxGetPr(x)[0]; %assuming the input is real valued, and it is only a number.
此外,在访问y
的值之前,您应首先获取其值;
double yVal;
yVal = mxGetPr(y)[0];
重要的是prhs[0]
和plhs[0]
是指向实际数据(值,大小,类型等)的指针,它们不是可以直接使用的值。
此外,在第19行:
19: if(nrhs < 1 or nrhs > 2)
我不确定C中的or
运算符是or
,而是您可以写
19: if(nrhs < 1 || nrhs > 2) #replaced "or" with two lines
第25行:
25: c = 3.0;
但是C不像Matlab,你应该在使用之前定义变量c
。
我对X
和Y
的功能感到有点困惑,因为它们显然是x,y
变量类型的指标,而不是要打印的值。如果您已按上述方式编写double yVal = mxGetPr(y)[0];
,则行33
可以更改为:
30: Y=mxIsDouble(y);
33: mexPrintf ("the value for y is %d",yVal);