"Matlab调用C语言编程"
Matlab是一个解释型的编程环境,具有交互性强、执行速度慢等特点。为了提高执行速度,可以使用C语言编写mex程序,调用Matlab中的基础矩阵运算函数,避免使用循环语句。Mex程序是一个根据一定的接口规范编写的DLL文件,可以使用C语言或Fortran语言编写。
Matlab中的基础矩阵运算函数都是以二进制程序的形式存在的,运行速度远远快于解释执行。例如,使用ticfor i=1:10000b(i)=a(10001-i);end可以实现将向量a里的数据逆序赋给向量b,但这种方法执行速度很慢;而使用ticb=a(10000:-1:1);可以实现相同的功能,但执行速度很快。这是因为Matlab里的基础矩阵运算函数都是以二进制程序的形式存在的,运行速度远远快于解释执行。
Mex程序可以调用C语言编写的函数,实现高速执行。例如,可以编写一个max2.dll的mex函数,然后将其加到Matlab的搜索路径中,就可以像调用普通Matlab函数一样来调用它了。由于把循环体放到了二进制程序中,执行速度快得多。
为了编写mex程序,需要安装VC、BC或Watcom C编译器,并在Matlab中设置编译器路径。在设置编译器路径时,只能使用路径名称的8字符形式。例如,如果使用VC5装在路径C:\PROGRAM FILES\DEVSTUDIO下,那么在设置路径时就要写成:C:\PROGRA~1。
编写mex程序需要使用mex.h头文件,并定义mexFunction函数。例如,以下是一个简单的mex程序hello.c:
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){
mexPrintf("hello,world!\n");
}
这个程序可以在Matlab中使用mex命令编译,例如:
mex hello.c
如果编译成功,会生成一个HELLO.DLL文件,可以在Matlab中调用该函数。
分析hello.c程序,可以看到程序的结构是十分简单的,整个程序由一个接口子过程mexFunction构成。mexFunction函数有四个参数:nlhs、plhs、nrhs和prhs。其中,nlhs是输出参数数目,plhs是指向输出参数的指针,nrhs是输入参数数目,prhs是指向输入参数的指针。
例如,使用[a,b]=test(c,d,e)调用mex函数test时,传给test的这四个参数分别是2、plhs、3、prhs。其中:prhs[0]=c、prhs[1]=d、prhs[2]=e。当函数返回时,将会把你放在plhs[0]、plhs[1]里的地址赋给a和b,达到返回数据的目的。
prhs和plhs都是指向类型mxArray类型数据的指针。这个类型是在mex.h中定义的,事实上,在Matlab里大多数数据都是以这种类型存在的。