您好,欢迎来到爱go旅游网。
搜索
您的当前位置:首页VB实现对MATLAB程序的调用

VB实现对MATLAB程序的调用

来源:爱go旅游网
第17卷 第5期             电脑开发与应用              (总231)   ・21・

VB实现对MATLAB程序的调用

TheMethodtoUseMATLABinVBSoftware

周竹生 陈灵君 张赛民(中南大学 长沙 410083)

【摘 要】 充分利用MATLAB强大的运算及显示功能和VB开发界面友好的特点,将二者有机结合,可以开发出复杂的、界面友好的人机交互处理软件。重点介绍了应用VB和MATLAB进行混合编程的几种技术,熟练掌握这些技术,将使编程工作变得轻松自如。

【关键词】 VB,MATLAB,混合编程,ActiveX技术,DLL

ABSTRACT TakingfulladvantageoffeaturesofstrongcapabilityincomputinganddisplayingofMATLAB,andfeaturesoffriendlyinterfaceofVB,andorganizingthetwotoolsproperly,anycomplicatedprocessingsoftwarewithfriendlyinteractiveinter-facemaybeexploited,thispaperdiscussesthreehybridprogrammingmethodsofusingMATLABinVBsoftware.Havingthesetechniquesatone'sfingerends,theprogrammingworkwillbeeasy.

KEYWORDS VB,MATLAB,hybridprogramming,ActiveXtechnique,DLL

1 问题的提出

MicrosoftVisualBasic是由微软公司开发的在Windows操作平台上的主力编程语言之一,由于它避开了C++编程过分繁琐和抽象的缺点,同时又能实现大多数Windows编程目的,因而一经推出就风靡全球,目前全世界大约有几百万程序员在使用VB编程,是一种十分强大和有生命力的Windows编程语言。虽然VB语言容易上手,界面容易设计,但是对于数值计算方面其能力欠佳。与之相比,MATLAB是新近发展起来的一种深受广大编程人员喜爱的数学工具软件。MATLAB语言可以提供与矩阵有关的强大的数据处理和图形显示功能,为软件开发人员在程序编制过程中实现数值计算和图形显示新添了又一行之有效的开发平台。但是,MATLAB的界面功能比较弱,给友好界面的开发应用或软件演示系统带来不便。

为了提高工程计算软件的开发效率和质量,可采取把VB可视化编程语言和MATLAB工具相结合的办法,充分利用MATLAB的运算功能和VB的开发界面方便的特点进行混合编程,即用VB来设计界面作为主程序,调用用MATLAB编写的子程序,以此开发出高质量、高性能的工程计算软件系统当属首选方案。其实现的过程有多种,根据作者在实践过程中的心得体会,重点介绍了其中三种比较方便、常用的实现

*  20040209收到

** 该项目获横向科研项目资助。

VB和MATLAB混合编程的方法技术。

2 调用方法

2.1 VB利用shell()函数调用MATLAB应用程序

该方法是一种最为简单、原始的调用方法,其中参数的传递是通过读写文件实现的。原始参数输入、输出都是由VB完成,在VB开发环境中按MATLAB语言格式写成M函数,然后调用MATLAB执行。

MATLAB提供了一个可以在启动MATLAB就能运行的M文件(startup.m),这样就可以在VB中修改startup.m的内容,然后用VB的shell(“…\\

)调用MATLAB程序立即执行MATLAB.EXE”

startup.m内的内容。startup.m文件格式是ASCII码

形式保存的,修改其内容是很容易的。

具体实现过程可按下面步骤进行。假设VB调用MATLAB的科学计算子程序为surp.m。

¹在startup.m文件最后加一句调用语句:surp.m。这样就可以调用用户写的子程序surp.m。

º在VB开发环境中打开surp.m并写入原始数据以及利用这些数据进行计算的程序行。

»在用VB编写的主程序中用shell()函数调用MATLAB应用程序。为了显示主程序界面最好调用方式用MATLAB程序最小化方式调用。

¼MATLAB应用程序运行后,先运行startup.m,

***周竹生,男,1965年生,博士后,1995年成都理工大学应用地球物理专业获工学博士学位,现在中南大学信息物理学院从事

石油资源勘察、工程物理探测、信号处理、应用软件及数据库开发等研究工作。  ・22・(总232)            VB实现对MATLAB程序的调用              2004年

接着运行surp.m,从而完成用户所要作的科学计算。½计算完成后,最好将startup.m内的“surp.m”程序去掉,这样保证不影响以后MATLAB应用程序的运行。

从上面所讨论的内容可以看出,程序的运行脱离不了MATLAB环境,无法开发出的可执行程序,难以用于商业目的。

2.2 利用ActiveX技术实现VB对MATLAB的调用

ActiveX部件是Microsoft公司提供的一种用于模块集成的新协议,它是VisualBasic工具箱的扩充部分。ActiveX部件是一些遵循ActiveX规范编写的可执行代码,比如一个.exe、.dll或.ocx文件。在程序中加入ActiveX部件后,它将成为开发和运行环境的一部分,并为应用程序提供新的功能。ActiveX部件保留了一些普通VB控件的属性、事件和方法。Ac-tiveX部件特有的方法和属性大大地增强了程序设计者的能力和灵活性。ActiveX实际上是在调用一种部件,而无需要求该部件对应的程序正在运行,这会使得其功能更加强大。

下面由一个例子来演示在MicrosoftVisualBa-sic6.0下,通过ActiveX自动化接口将MATLAB作为VisualBasic语言的一个ActiveX部件调用的方法与应用。本例子给出的原代码分别为:一段是简单利用最小平方QR分解算法(LSQR)计算稀疏矩阵的程序代码,另一段为调用MATLAB绘图功能进行图形显示的程序代码。

[例] 在VB下建立一个新窗口,其上有4个控件,其中有2个Command按钮,其VB名称分别为Command1和Command2,Command1用来调用MATLAB程序,Command2用来退出程序;还有1个TextBox控件,其VB名称为Text1,用来接收MAT-LAB命令;再有1个为Labe1控件,其VB名称为La-bel1,用于显示计算结果。设计本程序的初衷是:当按下“调用MATLAB”按钮Command1时,程序便运行事先在编辑框Text1中编辑好的MATLAB语句,并将其结果在Label1控件中显示出来。

其实现过程如下:

¹建立一个VB窗口,在其变量声明部分申明要调用MATLAB的ActiveX: DimMatlabAsObject

º在其代码窗中给按钮设定下面的响应命令来链接MATLAB的ActiveX部件:

 PrivateSubCommand1Click()

 SetMatlab=CreateObject(\"Matlab.Application\") Label1.Caption=Matlab.Execute(Text1.Text) EndSub

»在文本框内编辑以下程序段:

 n=100;on=ones(n,1);A=spdiags([-2*on4*on-on],-1:1,n,n);b=sum(A,2);

 tol=le-8;maxit=15;M1=spdiags([on/(-2)on],-1:0,n,n);

 M2=spdiags([4*on-on],0:1,n,n);x=lsqr(A,b,tol,maxit,M1,M2,[]);

 (注:上面段为LSQR计算代码) a=2;b=2; clf;

 x=-a:0.2:a;y=-b:0.2:b; fori=1:length(y)  forj=1:length(x)   ifx(j)+y(i)>1

    z(i,j)=0.57*exp(-0.75*y(i)^2-3.75*x(j)^2-1.5*x(j));

   elseifx(j)+y(i)<=-1

    z(i,j)=0.57*exp(-0.75*y(i)^2-3.75*x(j)^2+1.5*x(j));

   elsez(i,j)=0.7575*exp(-y(i)^2-6.*x(j)^2);   End  End End

 axis([-a,a,-b,b,min(min(z)),max(max(z))]); colormap(flipud(winter));

 surf(x,y,z); (注;此段为绘图程序代码)

点击VB程序的Command2按钮则得出如图1、

图2 调用MATLAB绘图效果

第17卷 第5期              电脑开发与应用              (总233)   ・23・

图2所示的效果。可见,调用ActiveX还是比较简单的,虽然在VB程序结束运行后MATLAB将自动关闭,但同样,这种方法所编制的程序并没有脱离MAT-LAB环境,需要在机器上安装好MATLAB系统。2.3 利用动态链接库调用MATLAB所写的程序MATLAB已经发展到了6.5版,虽然系统可以利用本身所带的编译器命令MCC将.m文件编译成可执行文件,但对于所开发的软件如果有频繁的数据交换,那么利用动态链接库能很好的解决实际问题;另一方面因为在MATLAB环境运行.m文件,在程序运行速度上较利用动态链接库慢许多。因此利用MAT-LAB语言写的程序所转换的动态链接库不失为一种实现VB与MATLAB相互编程的好方法。

MATLAB与C++结合非常紧密,有关C++与MATLAB相结合的文献也比较多,而VB与之相结合的相对较少。

MathTools公司利用Matcom技术编写了Mide-va工具软件,它可以借用C++编译器将Matlab下的.m文件转换为可被VisualC++、VisualBasic以及Delphi调用的DLL动态链接库或者是的可执行文件。读者可以通过查看Mideva工具软件的技术文档了解如何将.m文件转换到DLL。本文主要讨论如何在VB中调用这一类DLL。

用Mideva工具将.m文件编译后,将生成多个文件(有.DLL、.cpp、.bas等等),在VB集成环境中需要用到的文件有两个Testfile.dll(DLL文件)和Test-为在VB中file.bas(在VB中声明DLL的模块文件)。

能调用这类DLL,要求将Testfile.bas和Matlib42.bas加入到你的工程中,并将Testfile.dll以及

编译后,我们Matlib42.dll拷贝到工程所在的目录下。

在VB中的函数名为Testfileinout,其中,in和

out分别为函数的输入参数和输出参数的个数,例如c=conv(a,b),编译转换后的函数名为conv21。我们可以在VB下直接调用相应的DLL进行计算,不需再到Matlab下进行编译执行。虽然要用到VC,但Matcom不要求用户编写C++的转换源代码,只需直接在VB下调用模板即可。这样,用户不需了解较底层的编程语言,只要基于Matlab和VB,加上Matcom转换工具即可编制出囊括数值计算、图形显示、数据库处理及智能交互界面等各种类型的复杂的软件。

要想在VB中使用DLL,必须在你的工程中包含DLL的声明文件(即模块文件),同时还要将DLL拷贝到工程文件所在的目录中。事实上,Testfile.dll中

的函数并不能直接与集成环境进行数据交换,它只能通过矩阵句柄进行接口。这些句柄与文件句柄类似,它是用一个32位的矩阵整数来表示的,它们可以被创建,也可以被删除,通过它可以对矩阵数据进行操作。这样,集成环境与DLL之间需要一个中间层,Math-Tools提供了一个单独的C++库文件Matlab42.dll以及相应的模块文件Matlab42.bas。Matlab42.dll相当于VB集成环境与DLL之间的代理,在这一DLL中包含有20多个矩阵句柄操作函数和800多个从Matlab转换而来的矩阵函数。

在编程的时候,必须调用mtInitM来初始化库文件,即请求允许使用转换的DLL,并调用mtExitM来结束这种请求。另外,还要使用其他的矩阵句柄函数来分配、访问和释放矩阵句柄。

3 结 论

本文简单介绍了VB与MATLAB混合编程的三种技术。MicrosoftVB作为开发软件,使用特别方便,尤其在开发界面方面有独到优点,但是在计算与图形显示方面,显得能力不足。MATLAB系统中有许多科学计算及图形显示方面的函数,这样工程计算人员就可以编写简单的语句调用这些现成的函数或编写出用户自己想要实现的功能函数。充分利用两个软件的优点进行混合编程,可以编制出界面友好、计算及图形处理能力强大的软件。对于从事工程计算编程的工作者来说,经常面临庞大的数据处理工作量,其中不乏大型矩阵运算和复杂的显示问题。充分利用MATLAB的运算和图形显示功能,将使编程工作效率得到极大的提高。VB与MATLAB之间混合编程还可以通过MATLAB系统制作用户控件技术来实现,本文未作叙述,读者可以通过阅读MATLAB系统技术文档进一步深入了解。

参考文献

1 张志涌.精通MATLAB6.5版.北京:北京航空航天大学出

版社,2003,3:503~576

2 段晓君.将MATLAB函数转换为VB可用的DLL.电脑与

信息技术,2000(1):44~47

3 王 颖.ActiveX:从VisualBasic6.0调用MATLAB的实

现方法.机电工程,1999(5):72~74

4 SCard,SGEick,NGersho.InformationVisualization.New

York:ACMSiggraph'98course,ACM,1998(8News):9~15

5 顾 斌,杨德斌.VisualBasic6.0数据库开发.北京:清华大

学出版社,2000.7:587~672

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务