【MATLAB与C的混合编程】之【MATLAB调用C程序】

首先,在MATLAB中配置C编译器,命令mex -setup

1)提示Would you like mex to locate installed compilers [y]/n?选n

2)提示Compiler:选8 (注:Microsoft Visual C++ 2008 SP1)

3)提示Use C:\Program Files\Microsoft Visual Studio 9.0 anyway [y]/n?选n

4)提示Please enter the location of your compiler: [C:\Program Files\Microsoft Visual Studio 9.0]选D:\Program Files\Microsoft Visual Studio 9.0

5)确认,安装编译器成功

现在开始MATLAB与C的混合编程之旅!

先普及知识:

函数mexFunction(输出参数个数,输出参数指针,输入参数个数,输入参数指针)

============================================================

/*hello.c*/

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

{

mexPrintf("hello,world!\n");

}

//先输入mex hello.c进行编译,你会看到目录下多出一个hello.mexw32文件(下面例子不再给出这句注释)

//调用:hello

//显示:hello,world!

============================================================

//hello.c 2.0

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

{

int i;

i=mxGetScalar(prhs[0]);

if(i==1)

mexPrintf("hello,world!\n");

else

mexPrintf("大家好!\n");

}

//调用:hello

//显示:大家好!

//调用:hello(1)

//显示:hello,world!

//调用:hello(2)

//显示:大家好!

============================================================

//hello.c 2.1

#include "mex.h"

void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])

{

int *i;

i=mxGetPr(prhs[0]);//指向输入矩阵的地址

if(i[0]==1)

mexPrintf("hello,world!\n");

else

mexPrintf("大家好!\n");

}

//调用:a=1:10;hello(a)

//显示:hello,world!

//调用:c=2:11;hello(c)

//显示:大家好!

============================================================

===================函数mxGetPr、mxGetM、mxGetN====================

============================================================

//show.c 1.0

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

{

double *data;

int M,N;

int i,j;

data=mxGetPr(prhs[0]); //获得指向矩阵的指针

M=mxGetM(prhs[0]); //获得矩阵的行数

N=mxGetN(prhs[0]); //获得矩阵的列数

for(i=0;i<M;i++)

{

for(j=0;j<N;j++)mexPrintf("%4.3f ",data[j*M+i]);//data[j*M+i]值得玩味

mexPrintf("\n");

}

/*for(i=0;i<N*M;i++)mexPrintf("%4.3f ",data[i]);

mexPrintf("\n");*/

}

//调用:a=1:10;b=[a;a+1];show(a)

//显示:1.000 2.000 3.000 4.000 5.000 6.000 7.000 8.000 9.000 10.000

//继续输入:show(b)

//显示:

//1.000 2.000 3.000 4.000 5.000 6.000 7.000 8.000 9.000 10.000

//2.000 3.000 4.000 5.000 6.000 7.000 8.000 9.000 10.000 11.000

============================================================

=====================函数mxCreateDoubleMatrix======================

============================================================

//reverse.c 1.0

#include "mex.h"

void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])

{

double *inData;

double *outData;

int M,N;

int i,j;

inData=mxGetPr(prhs[0]);

M=mxGetM(prhs[0]);

N=mxGetN(prhs[0]);

plhs[0]=mxCreateDoubleMatrix(M,N,mxREAL);

outData=mxGetPr(plhs[0]);

for(i=0;i<M;i++)

for(j=0;j<N;j++)

outData[j*M+i]=inData[j*M+i]+10;

}

//调用:r=reverse(b)

//显示:11 12 13 14 15 16 17 18 19 20

// 12 13 14 15 16 17 18 19 20 21

【引文】http://blog.csdn.net/sbtdkj1017/archive/2007/11/25/1901647.aspx