【摘要】首先简单地介绍了Visual C++和Matlab的发展情况,紧接着介绍了Visual C++和Matlab联合编程的两种方法,并着重介绍了软件开发的过程的关键步骤,最后对其效果进行总结。 【关键词】Matlab5.3 Matlab引擎 Visual C++6.0 Matcom4.5 联合编程 1 前言 Visual C++ 是由 Microsoft 公司推出的可视化编程语言,它是目前综合性最高、最强大、也是最难学的软件开发工具之一,应用极为广泛。Matlab是Mathwork公司推出的一种高性能的数值计算和和可视化软件, 其全称为Matrix Laboratory,亦称矩阵实验室,它在数值分析、信号处理、系统辨识、特殊函数和图形等方面具有广泛的应用。MATLAB的突出特点是简洁,它利用丰富的函数资源,给用户带来最直观的开发环境。 由上可见,如果我们能够把 Matlab与Visual C++很好地结合起来,那将大大地提高编程者的工作效率。本文就是与大家来共同探讨这一问题。 2 Visual C++6.0和Matlab5.3的无缝结合 Matlab本身就是作为一个开放的系统,它提供了与多种语言的接口,Matlab引擎(Matlab engine)技术可以实现Visual V++和Matlab的无缝连接。 2.1 Matlab引擎简介 Matlab engine提供了一组 Matlab API 函数,用户不必关心 Matlab engine是如何实现的,只要调用这些函数即可,正是通过这些 API 函数实现应用程序进程之间的传递数据,从而达到两者之间的无缝结合。 2.2 Matlab engine的API函数 Matlab engine 库中的API函数如下: (1)engOpen,开启Matlab engine。 (2)engClose,关闭Matlab engine。 (3)engGetArray,从Matlab engine中获得一个Matlab矩阵,用于数据交换。 (4)engEvalString,执行一个Matlab命令。 (5)engPutArray,从应用程序向Matlab engine发送一个Matlab矩阵,用于数据交换。 (6)engOutputBuffer,作用是创建字符缓冲区以获取Matlab文本输出。 2.3 软件开发步骤 开发环境:Windows98、Visual C++和Matlab5.3。 (1)相应的导入库:VC 要调用 Matlab engine,还需要库文件的支持, 在 Matlab安装目录\extern\include\ 下有如下文件:libeng.def、libmx.def、libmat.def 和 matlab.def 等, 然后在DOS下执行命令生成相应的库文件,lib的命令执行形式如下: lib/def: libeng.def/out: libeng.lib /machine:ix86 同理生成了libmx.lib、libmat.lib和matlab.lib等,然后把生成的库文件加入到VC工程的Project->Settings->link->Object/Library Modules文本框中。 (2)编写M文件:以一个简单的三维绘图程序为例,M文件为:surf(peaks); (3)生成 VC主界面:VC 界面编写很容易,可任意加入菜单、快捷键和工具条等。 (4)把(2)中生成的M文件加入到 VC工程中:首先,在调用engine的文件中加入#include “engine.h”;其次,在CMainFrame的构造函数中加入代码 Engine *ep; if(!(ep=engOpen(NULL))) {fprint(stderr,”\nCan’t start Matlab engine\n”); return EXIT_FAILURE;} 再次,在析构函数中加入engClose(ep);最后,在相应的菜单响应函数等中加入 engEvalString(ep,“surf(peaks)”); (5)把 Matlab中的*.h文件拷贝到VC相应的存放*.h文件的目录中,就可编译运行了。 这样, 生成的应用程序就是我们编写软件的原型, 我们只要在这一框架下加入相应的代码就可以开发出各式各样的软件,然而这一方法存在着致命的缺陷。VC产生的应用程序可以脱离其编译环境而独立运行,而Matlab并不是这样。这样我们用VC和Matlab联合开发的应用软件就不具有很好的移植性,也直接影响软件的推广。试想一下,我们总不能要求用户在自己的计算机上装上一个庞大的Matlab。由此可见,Matlab engine这一种结合方式从其本身来说是无缝的,然而并不完美。 3 Matcom~Visual C++6.0和Matlab5.3的完美结合 MathTools 公司推出的 Matcom4.5(可在 http://www.mathtools.com 出获得,也可在国内很多数学方面的网站得到),使上述问题得到了圆满的解决 Matcom可以把 Matlab 的M文件转成相同功能的C++代码。这样的话,既保持了Matlab的优良算法,又利用了C++的高效率。也就是说,开发人员可以在 VC 的编译环境下,建立友好和漂亮的界面;而一些底层工作,如数值分析、图像处理、仿真等原来要用VC实现的较复杂的工作,统统交给 Matlab 来做。这样在 Matlab下编译的M文件,经过 Matcom 将其转化为C++代码,再将其放置到适当的位置即可。 下面详细介绍如何使 Matlab5.3与 Visual C++6.0 实现完美结合。 运行环境:Matcom4.5、Matlab5.3、Visual C++6.0和 Windows98 等。 步骤: (1) 设置 Matcom 所对应的编译器的类型、数据类型。 (2)所需的M文件转化成 C++代码 Matlab 的M文件如下: Function example surf(peaks); 经过 Matcom 后变成的 C++子程序如下: #include “matlib.h” #pragma hdrstop #include “example.h” Mm example() {begin_scope 。。。。。。 (生成的源程序复杂难懂,但不需要开发人员读懂) end_scope } 生成相应的主程序如下: #include "matlib.h" #pragma hdrstop #include "example.h" int main() {begin_scope initM(MATCOM_VERSION); example(); exitM(); return 0; end_scope } 图1 三维曲面图 所得的三维曲面图如图1所示 由此可见,通过这一方法生成的应用程序可以脱离 VC 和 Matlab 两种编译环境,如此生成的应用程序的可移植性和推广性将大大提高。 4 总结 随着计算机和信息技术的不断发展,各行各业的技术人员都需要运用计算机编程来解决日常工作中遇到的各种各样的问题, 因此, 提高编程效率就变得很重要了。本文介绍了两种 VC 和 Matlab 的联合编程方法,目的就是为了提高编程效率,从而大大的缩短软件的开发周期。Visual C++6.0 和 Matlab5.3 都是非常强大的开发工具,如果能够很好地把它们结合起来,相信大家很快就能够开发出功能强大的各式各样的商业软件。 (责任编辑:泉水) |