基于ActiveX引擎的VC++与Matlab混合编程及其应用
2010-01-29王若亮李晶娣
慕 巍,王若亮,李晶娣,邱 亚
(1.西安应用光学研究所 陕西 西安 710065;2.西安飞行自动控制研究所 陕西 西安 710065)
VC++是微软公司推出的一套面向对象的可视化集成编程系统[1],是Windows平台下构建32位应用程序的强大而又复杂的开发工具[2],但其在科学计算方面函数库不够丰富,读取、显示数据图形不方便。Matlab是Matrix Laboratory(矩阵实验室)的缩写,是由美国MathWorks公司开发的集数值分析、符号计算和图形可视化三大基本功能于一体,功能强大、操作简单的语言[3]。它包含大量高度集成的函数可供调用,是适合科学研究、工程设计等众多学科领域使用的简洁、高效的编程工具[4]。
为充分发挥这二者优势,利用Matlab提供的ActiveX引擎,实现在VC++开发的应用程序中完全控制Matlab,使用户轻松开发出高效、功能强大的应用程序,为工程实践和科研工作提供强大的技术支持。
1 Matlab ActiveX引擎
Matlab ActiveX引擎(engine),是指一组Matlab提供的接口函数[5],支持C/C++、Fortran等语言,通过这些接口函数,用户可以在VB、Delphi、VC++等编程环境中实现对Matlab的控制,将Matlab作为一个操作引擎使用,使其在后台运行。操作Matlab引擎常用的函数及其功能如表1所示。
表1 Matlab引擎常用的函数及其功能表Tab.1 Functions of Matlab engine
通过引擎方式,应用程序会打开一个新的Matlab进程,将Matlab作为一个功能强大的和可编程的数学函数库,调用Matlab中大量的数学计算和图形处理函数,通过控制它完成任何计算和绘图操作。同时,引擎方式打开的Matlab进程会在任务栏显示自己的图标,打开该窗口,可以观察主程序通过引擎方式控制Matlab运行的流程,并可在其中输入任何Matlab命令。
2 ActiveX引擎实现VC和Matlab混合编程
在VC++编程环境下利用Matlab ActiveX引擎实现VC++和Matlab的混合编程,需要对VC++编译环境和应用程序进行设置,具体步骤如下:
1)通过菜单 Tools/Options,打开Visual C++6.0设置属性页,进入Directories选项卡,在Show Directories for下拉列表中选择 Include Files,添加路径:E:MATLAB7externinclude(假定Matlab的安装目录为E:MATLAB7),如图1所示。
图1 VC++编译环境设置步骤1Fig.1 Step 1 of setting VC++compiling environment
2)再通过Show Directories for下拉列表中选择 Library Files,添加路径:E:MATLAB7externlibwin32Microsoftmsvc70,如图2所示。
图2 VC++编译环境设置步骤2Fig.2 Step 2 of setting VC++compiling environment
3)通过菜单 Projects/Settings,进入 Link页面,在 Object/Library Modules框中,添加库文件名:libmx.lib,libmat.lib,libeng.lib,如图3所示。
4)在使用Matlab引擎函数的程序头文件中添加如下代码:
图3 VC++编译环境设置步骤3Fig.3 Step 3 of setting VC++compiling environment
5)在应用程序中添加调用Matlab引擎的程序代码:
if(!(ep=engOpen(NULL))) //测试是否启动 Matlab 引擎成功
以上步骤是对VC与Matlab混合编程的编译环境和应用程序进行设置,在完成了以上基本步骤后就可以利用Matlab引擎库函数engEvalString来调用Matlab的内建函数了。以上步骤 1)、2)只需设置一次,而步骤 3)、4)、5)对每个工程都要单独设定。
3 应用实例分析
对大部分软件研发人员来说利用VC++编程方便、高效,但是要显示数据图形就不那么容易了,这时可利用Matlab ActiveX引擎辅助画图做数据分析。下面通过一个具体的应用实例来说明如何实现VC++与Matlab ActiveX引擎的混合编程。程序的主要功能是在VC++中对数组x计算函数值y=5sinx,然后调用Matlab绘制函数y对x的曲线。
首先,利用VC++6.0的MFC建立一个基于对话框的应用程序,如图4,添加相应按扭,并为其添加相应的成员函数。
图4 ActiveX引擎测试程序界面Fig.4 Interface of ActiveX engine of test program
其次,根据前面介绍的ActiveX引擎实现VC++和Matlab混合编程的实现步骤,为程序设置相应的编译环境并添加连接库函数。
然后,调用Matlab的内建函数和命令,主要编写程序代码如下:
1)在“启动引擎”按扭的成员函数中,添加如下代码:
if(!(ep=engOpen(NULL))) //测试是否启动 Matlab 引擎成功
2)在“关闭引擎”按扭的成员函数中,添加代码:
engClose(ep);//关闭 Matlab 引擎
3)在“测试”按扭的成员函数中,添加如下代码:
//定义 mxArray数组 xx,yy,为 1行,100列的实数数组
mxArray*xx=mxCreateDoubleMatrix(1,100,mxREAL);
mxArray*yy=mxCreateDoubleMatrix(1,100,mxREAL);
memcpy(mxGetPr(xx),x,100*sizeof(double));//将 x 复制到mxarray数组xx中
memcpy(mxGetPr(yy),y,100*sizeof(double));//将 y 复制到mxarray数组yy中
engPutVariable(ep,“xx”,xx);//将 mxArray 数组 xx 写入到Matlab,命名为xx
engPutVariable(ep,“yy”,yy);//将 mxArray 数组 yy 写入到Matlab,命名为yy
engEvalString(ep,“plot(xx,yy);”);//向 Matlab 引 擎 发送画图命令
engEvalString(ep,“xlabel(‘x’);”);//向图形窗口添加横坐标标注
engEvalString(ep,“ylabel(‘y=5*sin(x)’);”);//向图形窗口添加纵坐标标注
编译运行,先点击“启动引擎”按钮,Matlab引擎启动后,再点击“测试”按钮,就可以得到如图5所示的结果。
该实例是利用ActiveX引擎实现VC++与Matlab混合编程的一个简单应用,在实际的数值计算、信号处理、控制系统开发等工程应用中,可以很好的利用基于ActiveX引擎的VC++和Matlab的混合编程技术,简化应用程序的开发过程,缩短开发周期。
图5 ActiveX引擎测试曲线Fig.5 Test curve of ActiveX engine
4 结束语
本文详细介绍了在VC++编译环境下利用Matlab提供的ActiveX引擎实现应用系统设计和分析的具体方法,并通过一个具体应用实例介绍了VC++如何利用Matlab ActiveX引擎进行辅助画图和数据分析。
Matlab不但具有强大的数值计算和符号计算能力,而且为不同领域提供了丰富的工具箱[5]。而VC++在面向对象的应用程序开发方面功能强大、灵活性好[6]。利用Matlab提供的ActiveX引擎,实现了VC++和Matlab的混合编程,能够发挥各自优势,为用户提供了一个友好的编程接口,缩短了工程应用软件的开发周期,同时也提高了程序的运行效率。
[1]姚领田.精通MFC程序设计[M].北京:人民邮电出版社,2006.
[2]谢佩军,计时鸣,张利.VC++与MATLAB混合编程的探讨[J].计算机应用与软件,2006(2):128-130.XIE Pei-jun,JI Shi-ming,ZHANG Li.Research of combined programming of VC++and MATLAB[J].Computer Applications and Software,2006(2):128-130.
[3]张静.MATLAB在控制系统中的应用[M].北京:电子工业出版社,2007.
[4]王沫然.MATLAB 6.0与科学计算[M].北京:电子工业出版社,2001.
[5]刘志俭.MATLAB应用程序接口用户指南[M].北京:科学出版社,2000.
[6]彭猛.VC++与MATLAB混合编程的研究 [J].科技咨询导报,2007(8):21-21.PENG Meng.Research on hybrid programming of VC++and Matlab[J].Science and Technology Consulting Herald,2007(8):21-21.