汤俊, 张磊,楼力律
(河海大学 机电工程学院,江苏 常州 213022)
自编头文件的C-MEX混合编程
汤俊, 张磊,楼力律
(河海大学 机电工程学院,江苏 常州 213022)
摘要:当使用MATLAB进行大规模数据处理时,一个工程中包含了多个程序,而且各程序需交叉调用多个子程序,这将导致程序执行效率低下。基于VC与MATLAB的自编头文件的C-MEX混合编程可以有效解决这一问题。该方法在C/C++中自编一个头文件,声明需要用到的所有算法实现函数,并在另外的程序中编写这些函数的代码,通过mexFunction接口函数实现VC与MATLAB混合编程。
关键词:C/C++;MATLAB;C-MEX;自编头文件;混合编程
0引言
MATLAB在科学研究与工业技术开发方面有着极为广泛的应用,具有强大的矩阵运算、数据处理和图形显示功能,其输出结果可视化,编程效率极高,极少的代码即可实现复杂的运行。利用这一完整的数学平台,用户可以快速实现十分复杂的功能,极大地提高了工程分析计算的效率。但与其他高级程序相比,Matlab 使用一种脚本语言,它的执行是逐行解释执行的,也就是边解释边执行,执行效率非常低,这就是常常看到的在开发一些复杂的算法时,通常会发现程序执行很慢[1]。
C/C++语言是目前最为流行的高级程序设计语言之一[2]。它的功能丰富、表达力强、使用灵活方便、应用面广、目标程序高、可植入性好,适合作为系统描述语言,既可以用来编写系统软件,也可以用来编写应用软件。在工程实践中,用户使用MATLAB进行大规模数据处理时,会碰到复杂的循环语句程序,以及多程序调用多算法函数的情况。MATLAB往往由于执行效率的问题而显得力不从心,这时可以使用C/C++语言进行算法的设计,然后在MATLAB环境中调用,从而大大提高数据处理的效率[3]。在C/C++与MATLAB混合编程过程中,使用C-MEX文件是一种常用的方法。本文基于MATLAB7.0和VC6.0开发环境,自编声明算法实现函数的头文件,在接口函数mexFunction()程序中包含该头文件,实现C-MEX的混合编程。
1MEX文件的环境配置
实现MEX文件的编写与编译首先需要对MEX编译器进行配置,生成配置文件[1]。对MATLAB编译应用程序mex的配置命令为:
>>mex -setup
然后按系统提示进行选择,本文选择Microsoft Visual C++ 6.0作为编辑器。
2MATLAB调用自编头文件的MEX文件
所谓MEX是MATLAB Executable的缩写,它是一种“可在Matlab 中调用C(或Fortran)语言的衍生程序”[4]。C语言MEX文件的源程序主要由两个截然不同的部分组成,分别用于完成不同任务。第一部分称为计算程序,它包含了所有实际需要完成计算功能的源代码,用来完成实际的计算工作,即用户以前所编写的算法和程序;第二部分称为入口子程序,它是计算子程序同MATLAB环境之间的接口,用来完成两者之间的通信任务。它定义被MATLAB调用外部子程序的入口地址,MATLAB系统向子程序传递的子程序参数、子程序向MATLAB系统返回的结果参数,以及调用计算功能子程序等[1]。MEX源文件的两个组成部分既可以存放在一个文件中,也可以分为两个文件来存放。
当MEX源文件的计算程序和入口子程序分开存放时,即算法实现函数和接口函数mexFunction()分别在两个程序中,这时可以自编一个头文件,声明该算法实现函数,然后在新的程序中定义算法实现函数。注意编写的入口子程序必须包含自编的头文件。主要实现步骤如下:
1) VC6.0的编译环境设置。添加相应的头文件的路径:打开菜单【Tools:Options...】选择”Directories”选项卡。在”Show Directories for”组合框中选取”Include files”,添加”D:PROGRAM FILESMATLABR2010AEXTERNINCLUDE”;添加相应的库文件的路径:在”Show Directories for”中选取”Library files”添加”D:PROGRAM FILESMATLABR2010AEXTERNLIBWIN32MICROSOFT”;注意根据用户MATLAB安装位置,修改相应目录。
2) 创建工程,并在工程中添加入口子程序和计算程序两个C文件。
3) 在工程中添加声明计算程序中定义的算法实现函数的自编头文件。
4) 为工程添加DEF文件。
5) VC6.0的工程设置。添加需链接的库文件:打开菜单【Project:Setting】选取”Link”选项卡,在”Object/Library Modules”里添加libmx.lib、libmat.lib、libmex.lib和libeng.lib;动态库调试程序路径的设置:打开菜单【Project:Setting】选取”Debug”选项卡,在”Executable debug for session”中选择matlab.exe作为调试程序。
6) 调试程序,生成可执行mex文件。
3实例说明
下面通过一个简单的实例说明MATLAB如何调用含自编头文件C/C++生成可执行mex文件。
有一个用C语言写的函数,实现了一个功能,如一个简单的函数:
double add(double x,double y)
{return x+y;}
通过C-MEX混合编程生成mex文件实现在MATLAB使用它,如输入:
>>a=add(1.1,2.2)
a= 3.3000
mex文件实际上是一个特别的动态链接库,输出函数为mexFunction()。当使用C-MEX混合编程时,使用C/C++中的Win32 Dynamic Link Library、MFC APPWizard(DLL)静态链接库和扩展MFC动态链接库创建MEX程序[3]。首先根据章节2的步骤1做好VC6.0编译环境设置。这里新建一个MFC AppWizard(dll)工程,工程名为add,选择使用静态连接的MFC的DLL。在工程中添加入口子程序add.c、计算程序a.c、自编头文件add.h。为了方便读者阅读,将主要程序代码源代码整理如下:
//add.c
/*add.c中存放入口子程序*/
#include"add.h"/*add.h头文件中声明
计算实现功能函数aad()*/
#include"mex.h"
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);
/*调用计算实现功能函数aad()*/}
//add.h
/*add.h中声明计算实现功能函数add()*/
double add(double x,double y);
//a.c
/*a.c中存放计算实现函数代码*/
#include”add.h”
#include”mex.h”
double add(double x,double y)
{
return x+y;
}
根据章节2的步骤5做好工程设置后,打开该工程DEF文件,并对其内容进行编辑,即在Exports后面添加一行”;mexFunction()”。按F5运行程序调试,编译连接通过后,MATLAB作为调试路径自动启动。在Command Window里输入:
>>mex -v add.c a.c
成功生成add.mexw32,MATLAB便可以像调用m文件那样直接调用该文件。在MATLAB的Command Window里输入:
>> a=add(1.1,2.2)
a=3.3000
这与单独使用C/C++编写程序的运行结果一致。上述实例中只含有一个子程序a.c。如果入口子程序需调用多个算法函数,只需要在自编的头文件add.h中声明这些函数,在新的子程序中编写算法函数代码。需要注意的是在MATLAB的Command Window里输入的mex命令需包含主程序(入口程序)以及所有的子程序。
4结语
简单阐述了基于VC和MATLAB的自编头文件的C-MEX混合编程方法,实现了两种编程语言的无缝链接。对于多程序调用多个子程序的复杂情况,该方法可供工程人员进行参考,方便编程,提高数据处理效率。
参考文献:
[1] 王素立, 高洁, 孙新德. MATLAB混合编程与工程应用[M]. 北京:清华大学出版社, 2008.05.
[2] 钱能. C++程序设计教程[M]. 北京:清华大学出版社, 2005.
[3] 张亮,王继阳. MATLAB与C/C++混合编程[M]. 北京:人民邮电出版社,2008.11.
[4] 董长虹. Matlab接口技术与应用[M]. 北京:国防工业出版社, 2004.
C-MEX Mixed Programming with Self-compiled Header File
TANG Jun, ZHANG Lei,LOU Li-lu
(School of Mechanical and Electrical Engineering,Hohai University,Changzhou 213022,China)
Abstract:For large-scale data processing in MATLAB, multiple programs exist in a project and each program needs to cross-call multiple subprograms,so the execution efficiency of the program is low.The C-MEX mixed progrmming method based on VC and MATLAB can be used to deal be with this problem very well.In this method,by writting a self-compiled header file to declare all the algorithm implementation functions whose codes can be written in other programs,and using mexFunction as a interface function,mixed programming of VC and MATLAB can be realized.
Keywords:C/C++;MATLAB;C-MEX;self-compiled header file;mixed programming
中图分类号:TP311
文献标志码:A
文章编号:1671-5276(2015)02-0101-02
作者简介:汤俊(1986-),男,湖北黄冈人,硕士研究生,主要研究方向为等几何分析与结构优化设计。
收稿日期:2014-11-04