MATLAB中调用VC混合编程方法的研究与实现

2010-09-19 08:41宗节保成鸿飞段柳云
电子设计工程 2010年8期
关键词:调用文档编程

宗节保,尹 忠,成鸿飞,段柳云,王 莹

(武汉大学 电子信息学院,湖北 武汉 430072)

MATLAB是Mathworks公司推出的一款功能强大的数学软件,它集数值分析、矩阵计算、信号处理和图形显示于一身,包含大量高度集成的函数可供调用,命令语句功能强大,为科学研究、工程设计及众多学科领域提供了一种简洁、高效的编程工具,并在图像处理、控制设计、信号检测、金融建模设计等领域得到广泛应用[1]。但是MATLAB使用的是解释性语言,这限制了它的执行速度,不利于开发各种应用软件[2]。相比之下,VC是Windows平台下主要的应用程序开发环境之一,它能方便实现软件开发,开发出的系统具有界面友好、执行速度快、易维护和升级等优点[3]。同时,VC因其与操作系统和底层硬件交换的效率而在高级语言中得到广泛应用。

因此,如何实现VC和MATLAB的混合编程来提高代码运行效率就成了一个研究方向。一般情况下大多数应用侧重于通过在VC中利用MATLAB强大的数学运算功能[4-5],而在MATLAB中利用VC进行软件开发的例子比较少。然而利用MATLAB语言制作软件的过程中,经常会碰到一些MATLAB程序无法解决的问题,此时如果通过混合编程调用VC/VC++,这些问题便可迎刃而解。这种混合编程方法的运用,不仅能够更好地发挥MATLAB强大的功能,还能缩短软件开发周期,因而在仿真技术研究中具有重大实用价值。

本文将具体论述在MATLAB中调用VC的混合编程方法并将其应用于MATLAB的自动索引中从而极其方便地打开chm格式帮助文档并自动定位到文档的相应位置。

1 MATLAB中调用VC的混合编程方法

在MATLAB平台上调用VC一般是因为使用MATLAB语言来实现特定算法功能代码复杂、运行效率低下。这时候利用VC与系统和底层硬件交换效率及其强大的调试功能可以编写高效的算法程序,然后通过将VC上的源程序编译成可供MATLAB使用的库文件或MEX文件无疑很好地发扬了两种语言的优势。

VC和MATLAB混合编程的方法有很多种,主要分为以下几种:1)通过 MATLAB Engine方式;2)直接调用 MATLAB的VC数学函数库;3)使用matcom工具;4)使用MATLAB的combuilde工具;5) 用 MATLAB自带的 MATLAB Compiler[6]。在这5种方法当中,前4种一般用在VC中调用MATLAB函数的场合,第5种二者皆可并且简单易行,由于本文中是要实现在MATLAB中调用VC函数,故利用Compiler把VC编写的源程序即cpp程序编译成MEX文件供编写M文件时调用。

1.1 MEX文件执行流程

一个MEX文件的源程序是包括入口程序和算法程序的。当对C语言的MEX文件进行编译时,MATLAB首先从命令行获取输入矩阵,并赋给入口程序的输入参数指针组,入口程序对输入参数进行计算后创建输出矩阵,并将其赋给入口程序的输出参数指针组,最后使用入口程序的输入参数和输出参数作为算法程序的参数调用算法程序[7]。

下面以 MATLAB自带的一个 c-mex文件为例来说明MEX文件的执行流程。文件的源程序为timestwo.c,该程序实现一个数据两倍乘法过程。它有一个输入参数和一个输出参数。这里用到mex.h中定义的两个函数:mexGet()函数用于返回句柄的属性;mexCreat()用于创建矩阵。 图(1)以[y]=f(x)为例完整地表明了文件输入数据,算法程序调用和计算结果返回的过程。

1.2 利用MEX文件实现MATLAB下调用VC

MATLAB中调用VC的混合编程方法总体实现过程如图2所示。

1.2.1 MATLAB编译环境的设置

在MATLAB与VC混合编程之前,必须先对MATLAB的编译应用程序MEX和编译器mbuild进行正确的设置。

对MATLAB编译应用程序MEX的设置:Mex-setup。再根据系统提示进行选择路径和编译器。对MATLAB编译器mbuild的设置:Mbuild-setup。同理,按后面提示结合个人需要选择即可。

1.2.2 以混合编程方式创建cpp源文件

为了能够在MATLAB中调用VC,必须要有接口函数来起到“桥梁”的作用,在MATLAB中mexFunction就是这样一个函数,它同时也是MEX文件的一个专用接口函数。

而mexFunction函数则包含在头文件“mex.h”中,混合编程时需要用到这个接口函数,它含有4个参数,其中nlhs表示输出参数个数,nrhs表示输入参数个数,plhs是一个数组,其内容为指针且指向所有的输入参数,该指针指向数据类型mxArray,prhs是一个指向输出参数的指针数组,值得注意的是prhs是const的指针数组,即不能改变其指向内容。

1.2.3 mex文件的生成与调用

cpp文件是C++中的源文件,在MATLAB中无法直接调用或运行,只有通过转化为MEX文件后才能在MATLAB中调用它。可以通过在MATLAB命令窗口中直接输入MEX指令即可将相应的cpp源文件编译成MEX文件。

在MATLAB中生成的MEX文件名同时也是调用时的函数名,一般情况下在该调用函数时需要输入一些混合编程时已定义好的参数。这样在编写M文件时可以直接调用相应的MEX类型函数了。

2 MATLAB下文档自动索引的实现

给出利用MATLAB中调用VC的混合编程方法来具体实现在MATLAB中文档的自动索引。目前MATLAB尚不提供在其GUI控件的回调函数中直接编写代码定位到chm格式文档的方法。通过VC和MATLAB的混合编程,利用VC编写源程序并编译成MEX文件,这样在GUI控件的回调函数就可以通过 mexzdsy(’hh.exe ms-its:URL’)语句来直接定位到相应的文档页面,这无疑提高了编程效率,方便了用户使用。

VC源文件名为mexzdsy.cpp,核心代码如下:

在该例中WinExec函数包含在头文件“Windows.h”中,它也正是所需的VC中的函数,为了将mexzdsy.cpp这一文件转化生成MEX文件,需要在MATLAB的命令窗口中输入“mex mexzdsy.cpp”,则在当前工作目录下会生成一个名为“mexzdsy.mexw32”的文件,这一文件便是所需的MEX文件。

这样,可以在MATLAB的M文件编写中通过mexzdsy(’hh.exe ms-its:索引页地址’)这一形式语句来实现自动索引。其中hh.exe是Windows自带的系统文件,它用于打开chm格式的帮助文档,“ms-its”是一种协议,它定义了如何打开htm或html格式的文档,而索引页地址就是在帮助文档中显示的那一页的URL。

3 教学软件中的具体应用实例

利用MATLAB中调用VC的混合编程方法,在基于MATLAB程序制作的教学软件中实现了帮助文档的自动索引。帮助文档help.chm放在help文件夹中,例如如图3所示的软件界面。

点击按钮“动目标显示(MTI)”便会自动打开如图4所示的帮助文档并索引到指定页。

在基于MATLAB语言制作的软件中,如果单纯的利用MATLAB语言只能打开该帮助文档但无法索引到指定页,而通过混合编程在MATLAB中调用VC函数WinExec则有效的解决了这一问题。

4 结束语

从上面的分析中可以看出要实现在MATLAB中调用VC语言函数,关键是要掌握MATLAB中的接口函数和一些重要VC函数的用法,写出符合要求的VC源程序。VC和MATLAB混合编程可以充分发挥两种软件的优点,减少了代码重用,提高了程序运行速度。通过将VC和MATLAB混合编程引入到MATLAB文档的自动索引中弥补了MATLAB在这方面的不足之处,方便了用户的使用。随着MATLAB版本的升级,Mathworks公司有意加强了MATLAB在与其他高级语言混合编程方面的功能,相信这一混合编程的优势将应用于更广阔的领域。

[1]潘大夫,汪渤,周志强.Matlab与C/C++混合编程技术研究[J].计算机工程与设计,2009,30(2):200-210.

PAN Da-fu,WANG Bo,ZHOU Zhi-qiang.Technical research of hybrid programming by MATLAB and C/C++[J].Computer Engineering and Design.2009,30(2):200-210.

[2]潘孝勇,姜伟,杨继隆.Visual C++与MATLAB混合编程[J].计算机仿真,2004,21(3):140-143.

PAN Xiao-yong,JIANG Wei,YANG Ji-long.Hybrid programming by Visual C++ and MATLAB[J].Computer Simulation,2004,21(3):140-143.

[3]王周益,刘继兴,柳长安.VC++与MATLAB混合编程研究及开发实例[J].计算机应用研究,2006(5):154-155.

WANG Zhou-yi,LIU Ji-xing,LIU Chang-an.Research and development example of hybrid programming by VC++ and MATLAB[J].Application Research of Computers,2006 (5):154-155.

[4]谢永华,傅德胜.VC++和Matlab混合编程在图像处理中的应用[J].计算机应用与软件,2005,22(2):120-121.

XIE Yong-hua,FU De-sheng.Application of hybrid programming by VC++ and MATLAB in image processing[J].Computer Applications and Software,2005,22(2):120-121.

[5]赵志强,刘志成.VC++与Matlab混合编程技术应用分析[J].实验技术与管理,2009,26(1):99-101.

ZHAO Zhi-qiang,LIU Zhi-cheng.Application analysis of hybrid programming by VC++ and MATLAB[J].Experimental Technology and Management,2009,26(1):99-101.

[6]杨波,亓波.精通Matlab7.0混合编程[M].北京:电子工业出版社,2006.

[7]孙慧,李莉.Visual C++和MATLAB混合编程实现图像三维重建[J].微计算机信息.2007,23(18):294-296.

SUN Hui,LI Li.Implement of image three-dimensional reconstruction with hybrid programming by Visual C++ and MATLAB[J].Microcomputer Information,2007,23(18):294-296.

猜你喜欢
调用文档编程
浅谈Matlab与Word文档的应用接口
有人一声不吭向你扔了个文档
编程,是一种态度
元征X-431实测:奔驰发动机编程
编程小能手
纺织机上诞生的编程
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
基于系统调用的恶意软件检测技术研究
基于RI码计算的Word复制文档鉴别