Matlab与C混编的介绍

原本写给一个朋友的,帮助她入门matlab与C混编的

>#####环境:
* Matlab:MATLAB R2013a
* C编译器VC++2012

===
#####配置环境:
 在**Matlab**命令行下输入:

**step.1**

 ```
mex -setup
 
 ```

---
 **step.2**

你也可以使用:

 ```
 help mex

 ```
查看更多信息 

---

**step.3**

按提示安装C编译器

---
**step.4**

编写**c-mex**文件
可使用

```
edit

```
命令在matlab中打开编辑器


===


#####**C-MEX**文件的结构:
 * 引入头文件:

```
#include "mex.h" 

```
* 定义计算子函数

```
double add(double x, double y)
{
    return x + y;
}

```
*引入接口函数

```

void mexFunction(
int nlhs,
mxArray *plhs[],
int nrhs,
const mxArray *prhs[])
{
/*your code*/
}

```
====
####说明:

> 核心是计算子函数,在C语言中函数要先声明才能使用,所以计算子函数的函数声明放在前面。

> 接口函数是C语言和matlab的接口,或者理解成协议,桥梁也可以,它接受4个参数:nlhs是左手参数个数,plhs是左手参数数组其内容为指针,该指针指向数据类型为mxArray的变量。相对应的nrhs和prhs。

> 编写的**C-Mex**文件应该保存为.c文件,文件类型是**all file**,尤其要强调的一点是,该文件的文件名要和函数的函数名一致,不然使用的时候会报**undefined function**的错误

>当启用mex之后,你可以使用这段程序来检查环境是否正确:

```
[print.c]
# include "mex.h"

void mexFunction(int nlhs,double *plhs[],int nrhs,double *prhs[]){

    mexPrintf("hello");

}

```
保存为print.c之后命令行运行

```
>>mex print.c
>>print

```
如果编译没问题,打印出hello>>这种形式,那么说明环境ok

> 下面是一个完整的例子及其过程 :

```

[add.c]

#include "mex.h"  
 
double add(double x, double y)
{
    return x + y;
}
 
void mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])
{
    double *a;
    double b, c;
    plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
    a = mxGetPr(plhs[0]);
    b = *(mxGetPr(prhs[0]));
    c = *(mxGetPr(prhs[1]));
    *a = add(b, c);
}

```

在命令行中执行

```
mex add.c

```

来编译它

若无报错,再执行

```
c=add(1.1,2.2)

```
则c的值即是3.3

关于此段程序,可参考 [这篇文章](http://blog.sina.com.cn/s/blog_468651400100coas.html)