在参考文献基础上。补充和完善了。
Matlab与C/C++混合编程接口及应用
摘要:Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序设计语言,两者互补结合的混合编程在科学研究和工程实践中具有非常重要的意义。从Matlab调用C/C++代码及C/C++调用m文件两方面,深入地研究了它们之间混合编程的原理和实现机制,并且给出了具体条件下的混合编程方法和步骤。实验表明,给出的Matlab与C/C++混合编程接口及应用方法是有效、实用的。
1引言
Matlab是当前应用最为广泛的数学软件,具有强大的数值计算、数据分析处理、系统分析、图形显示甚至符号运算等功能[1]。利用这一完整的数学平台,用户可以快速实现十分复杂的功能,极大地提高工程分析计算的效率[2][3]。但与其他高级程序[3]相比,Matlab程序是一种解释执行程序,不用编译等预处理,程序运行速度较慢[4]。
C/C++语言是目前最为流行的高级程序设计语言之一[5]。它可对操作系统和应用程序以及硬件进行直接操作,用C/C++语言明显优于其它解释型高级语言,一些大型应用软件如 Matlab 就是用C语言开发的。
在工程实践中,用户经常遇到Matlab与C/C++混合编程的问题。本文基于Matlab 6.5和VC6.0开发环境,在Windows平台下就它们之间的混合编程问题进行深入研究并举例说明。
2 Matlab调用C/C++
Matlab调用C/C++的方式主要有两种:利用MEX技术和调用C/C++动态连接库。
在Matlab与C/C++混合编程之前,必须先对Matlab的编译应用程序mex和编译器mbuild进行正确的设置[1]:
对Matlab编译应用程序mex的设置:Mex –setup.
对Matlab编译器mbuild的设置:Mbuild –setup.
2.1调用C/C++的MEX文件
MEX是Matlab Executable的缩写,它是一种“可在Matlab中调用的C(或Fortran)语言衍生程序”[6]。MEX文件的使用极为方便,其调用方式与Matlab的内建函数完全相同,只需在Matlab命令提示符下键入MEX文件名即可。
一个C/C++的MEX源程序通常包括4个组成部分,其中前3个是必须包含的内容,第4个则根据所实现的功能灵活选用:(1)#include “mex.h”;(2)MEX文件的入口函数mexFunction, MEX文件导出名必须为mexFunction函数;(3)mxArray;(4)API函数
通过简单的例子说明C/C++的MEX源程序编写和调用过程:
#include "mex.h"
void timeSTwo(double y[], double x[])
{ y[0] = 2.0*x[0]; }
void mexFunction(int nlhs, mxArray * plhs[], int nrhs, const mxArray *prhs[])
{
double *x,*y; int mrows, ncols;
if( nrhs!=1) mexErrMsgTxt("One input required.");
else if( nlhs>1) mexErrMsgTxt("Too manyoutput arguments");
mrows = mxGetM( prhs[0] ); ncols = mxGetN(prhs[0]);
if( !mxIsDouble(prhs[0]) || mxIsComplex( prhs[0] ) || !( mrows ==1 && ncols==1 ) )
mexErrMsgTxt( "Input must be a noncomplex scalar double." );
plhs[0] = mxCreateDoubleMatrix ( mrows, ncols, mxREAL );
x = mxGetPr( prhs[0] ); y = mxGetPr( plhs[0] ); timestwo(y,x); }
可在matlab中编译,也可以直接在C++环境中编译:
1).(在matlab中)用指令mex timestwo.c编译此文件,然后在MATLAB命令行下调用生成的MEX文件即可。2). (在VC2008中)和一般c++一样编译后,就会产生dll,这样可以直接在Matlab中用了,或者copy且更改后缀名.mexw32即可。(因为Matlab R2010b以后版本可能不支持调用dll为后缀的mex文件了)
2.2调用C/C++动态连接库(即:一般普通的C程序dll没有用mex的接口函数)
Matlab提供对动态连接库DLL文件的接口[7]。利用该接口,可在Matlab中调用动态连接库导出的函数。Matlab