从C编译MEX文件

时间:2014-05-04 04:14:40

标签: c matlab mex

从以下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. 

我不知道该怎么办。我确定我做错了但我无法弄明白。

1 个答案:

答案 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

我对XY的功能感到有点困惑,因为它们显然是x,y变量类型的指标,而不是要打印的值。如果您已按上述方式编写double yVal = mxGetPr(y)[0];,则行33可以更改为:

30:   Y=mxIsDouble(y);
33:   mexPrintf ("the value for y is %d",yVal);