文档库 最新最全的文档下载
当前位置:文档库 › VB实现对MATLAB程序的调用

VB实现对MATLAB程序的调用

VB实现对MATLAB程序的调用
VB实现对MATLAB程序的调用

VB 实现对M AT LAB 程序的调用

The M ethod to Use M AT LAB i n VB Sof tware

周竹生 陈灵君 张赛民

(中南大学 长沙 410083)

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

【关键词】 VB ,M A TLAB ,混合编程,A ctiveX 技术,DLL

ABSTRACT T ak ing full advantage of features of strong capability in computing and disp laying of M A TLAB ,and features of friendly interface of VB ,and o rganizing the tw o too ls p roperly ,any comp licated p rocessing softw are w ith friendly interactive inter 2face m ay be exp lo ited ,th is paper discusses th ree hybrid p rogramm ing m ethods of using M A TLAB in VB softw are .H aving these techniques at one’s finger ends ,the p rogramm ing w o rk w ill be easy .

KEYWOR D S VB ,M A TLAB ,hybrid p rogramm ing ,A ctiveX technique ,DLL

1 问题的提出

M icro soft V isual B asic 是由微软公司开发的在W indow s 操作平台上的主力编程语言之一,由于它避

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

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

VB 和M A TLAB 混合编程的方法技术。

2 调用方法

2.1 VB 利用shell ()函数调用M AT LAB 应用程序

该方法是一种最为简单、原始的调用方法,其中参

数的传递是通过读写文件实现的。原始参数输入、输出都是由VB 完成,在VB 开发环境中按M A TLAB 语言格式写成M 函数,然后调用M A TLAB 执行。

M A TLAB 提供了一个可以在启动M A TLAB 就能运行的M 文件(startup .m ),这样就可以在VB 中

修改startup .m 的内容,然后用VB 的shell (“

… M A TLAB .EXE ”

)调用M A TLAB 程序立即执行startup .m 内的内容。startup .m 文件格式是A SC II 码

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

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

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

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

③在用VB 编写的主程序中用shell ()函数调用M A TLAB 应用程序。为了显示主程序界面最好调用

方式用M A TLAB 程序最小化方式调用。

④M A TLAB 应用程序运行后,先运行startup .m ,

3 20040209收到

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

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

石油资源勘察、工程物理探测、信号处理、应用软件及数据库开发等研究工作。

?

12?第17卷 第5期 电脑开发与应用 (总231)

接着运行su rp.m,从而完成用户所要作的科学计算。

⑤计算完成后,最好将startup.m内的“su rp.m”程序去掉,这样保证不影响以后M A TLAB应用程序的运行。

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

2.2 利用ActiveX技术实现VB对M AT LAB的调用

A ctiveX部件是M icro soft公司提供的一种用于模块集成的新协议,它是V isual

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

下面由一个例子来演示在M icro soft V isual B a2 sic6.0下,通过A ctiveX自动化接口将M A TLAB作为V isual B asic语言的一个A ctiveX部件调用的方法与应用。本例子给出的原代码分别为:一段是简单利用最小平方Q R分解算法(L SQ R)计算稀疏矩阵的程序代码,另一段为调用M A TLAB绘图功能进行图形显示的程序代码。

[例] 在VB下建立一个新窗口,其上有4个控件,其中有2个Comm and按钮,其VB名称分别为Comm and1和Comm and2,Comm and1用来调用M A TLAB程序,Comm and2用来退出程序;还有1个T ex tBox控件,其VB名称为T ex t1,用来接收M A T2 LAB命令;再有1个为L abe1控件,其VB名称为L a2 bel1,用于显示计算结果。设计本程序的初衷是:当按下“调用M A TLAB”按钮Comm and1时,程序便运行事先在编辑框T ex t1中编辑好的M A TLAB语句,并将其结果在L abel1控件中显示出来。

其实现过程如下:

①建立一个VB窗口,在其变量声明部分申明要调用M A TLAB的A ctiveX:

 D i m M atlab A s O b ject

②在其代码窗中给按钮设定下面的响应命令来链接M A TLAB的A ctiveX部件:

 P rivate Sub Comm and1C lick()

 Set M atlab=C reateO bject("M atlab.A pp licati on")

 L abel1.Cap ti on=M atlab.Execute(T ext1.T ext) End Sub

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

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

 to l=le-8;m axit=15;M1=spdiags([on (-2)on],-1: 0,n,n);

 M2=spdiags([43on-on],0:1,n,n);x=lsqr(A,b,to l, m axit,M1,M2,[]);

 (注:上面段为L SQ R计算代码)

 a=2;b=2;

 clf;

 x=-a:0.2:a;y=-b:0.2:b;

 fo r i=1:length(y)

fo r j=1:length(x)

if x(j)+y(i)>1

z(i,j)=0.54573exp(-0.753y(i)^2-3.753x(j) ^2-1.53x(j));

elseif x(j)+y(i)<=-1

z(i,j)=0.54573exp(-0.753y(i)^2-3.753x (j)^2+1.53x(j));

else z(i,j)=0.75753exp(-y(i)^2-6.3x(j)^2);

End

End

 End

 axis([-a,a,-b,b,m in(m in(z)),m ax(m ax(z))]);

 co lo r m ap(fli pud(w inter));

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

点击VB程序的Comm and2按钮则得出如图1

图2 调用M A TLAB绘图效果

?

2

2

? (总232) VB实现对M A TLAB程序的调用 2004年

图2所示的效果。可见,调用A ctiveX还是比较简单的,虽然在VB程序结束运行后M A TLAB将自动关闭,但同样,这种方法所编制的程序并没有脱离M A T2 LAB环境,需要在机器上安装好M A TLAB系统。2.3 利用动态链接库调用M AT LAB所写的程序

M A TLAB已经发展到了6.5版,虽然系统可以利用本身所带的编译器命令M CC将.m文件编译成可执行文件,但对于所开发的软件如果有频繁的数据交换,那么利用动态链接库能很好的解决实际问题;另一方面因为在M A TLAB环境运行.m文件,在程序运行速度上较利用动态链接库慢许多。因此利用M A T2 LAB语言写的程序所转换的动态链接库不失为一种实现VB与M A TLAB相互编程的好方法。

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

M athToo ls公司利用M atcom技术编写了M ide2 va工具软件,它可以借用C++编译器将M atlab下的.m文件转换为可被V isual C++、V isual B asic以及D elph i调用的DLL动态链接库或者是独立的可执行文件。读者可以通过查看M ideva工具软件的技术文档了解如何将.m文件转换到DLL。本文主要讨论如何在VB中调用这一类DLL。

用M ideva工具将.m文件编译后,将生成多个文件(有.DLL、.cpp、.bas等等),在VB集成环境中需要用到的文件有两个T estfile.dll(DLL文件)和T est2 file.bas(在VB中声明DLL的模块文件)。为在VB中能调用这类DLL,要求将T estfile.bas和M atlib42. bas加入到你的工程中,并将T estfile.dll以及M atlib42.dll拷贝到工程所在的目录下。编译后,我们在VB中的函数名为T estfile in ou t,其中,in和ou t分别为函数的输入参数和输出参数的个数,例如c =conv(a,b),编译转换后的函数名为conv21。我们可以在VB下直接调用相应的DLL进行计算,不需再到M atlab下进行编译执行。虽然要用到V C,但M atcom不要求用户编写C++的转换源代码,只需直接在VB下调用模板即可。这样,用户不需了解较底层的编程语言,只要基于M atlab和VB,加上M atcom 转换工具即可编制出囊括数值计算、图形显示、数据库处理及智能交互界面等各种类型的复杂的软件。

要想在VB中使用DLL,必须在你的工程中包含DLL的声明文件(即模块文件),同时还要将DLL拷贝到工程文件所在的目录中。事实上,T estfile.dll中的函数并不能直接与集成环境进行数据交换,它只能通过矩阵句柄进行接口。这些句柄与文件句柄类似,它是用一个32位的矩阵整数来表示的,它们可以被创建,也可以被删除,通过它可以对矩阵数据进行操作。这样,集成环境与DLL之间需要一个中间层,M ath2 Too ls提供了一个单独的C++库文件M atlab42.dll 以及相应的模块文件M atlab42.bas。M atlab42.dll相当于VB集成环境与DLL之间的代理,在这一DLL 中包含有20多个矩阵句柄操作函数和800多个从M atlab转换而来的矩阵函数。

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

3 结 论

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

参考文献

1 张志涌.精通M A TLAB6.5版.北京:北京航空航天大学出版社,2003,3:503~576

2 段晓君.将M A TLAB函数转换为VB可用的DLL.电脑与信息技术,2000(1):44~47

3 王 颖.A ctiveX:从V isual Basic6.0调用M A TLAB的实现方法.机电工程,1999(5):72~74

4 S Card,S G E ick,N https://www.wendangku.net/doc/9712303864.html, r m ati on V isualizati on.N ew Yo rk:A C M Siggraph’98course,A C M,1998(8N ew s):9~15

5 顾 斌,杨德斌.V isual Basic6.0数据库开发.北京:清华大学出版社,2000.7:587~672

?

3

2

?

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

VB和Matlab传递数据

VB和Matlab传递数据 lb107 VB和Matlab传递数据 请问: 我想将m函数文件编译成dll文件,在VB里面输入数据然后调用这个dll进行计算,这样能够实现吗? 有兄弟有相关的例子没?网上VC调用Matlab的例子挺多的,但没有VB调用Matlab的例子。 谢谢指点。 2006-3-5 20:19 taohe Re:VB和Matlab传递数据 VB调用DLL会不会很复杂?总感觉VB属于高级编程语言,在调用DLL方面不会比VC更难才对。根据网上你发现的VC调用MATLAB产生的DLL的例子,大概了解MATLAB产生的DLL,然后在VB中调用,貌似应该顺理成章。 使用VB的话,一个好的方案可能是使用MATLAB产生的COM组件,而不是普通的DLL。在VB中可以很方便地使用这些COM组件。MATLAB的在线帮助有较详细的例子,不妨看看。 2006-3-5 23:01 bainhome Re:VB和Matlab传递数据 前一段儿看了看书,做过两个简单的,下面这个是其中之一(曾发在别的论坛上,转一下),因最近实在是太忙,没有时间研究,所以比较基础,没有更加复杂的Trick 比如将VBtext中的数组作为COM的input、图形绘制等等,VB代码:[code] Private addn As addn.Add Private Sub Command1_Click() Dim x As Double Dim y As Variant x = CDbl(Text1.Text) Call addn.numadd(1, y, x) Text2.Text = y End Sub Private Sub Command2_Click() End End Sub Private Sub Form_Load() Set addn = New addn.Add Form1.Caption = "VB调用MATLAB示例" Text1.Text = 2 End Sub [/code] [code] function y=numadd(x) y=2*x; [/code] COM组件调用格式: [code]call h.func(numout,arg1,arg2,...)[/code] MATLAB中的函数书写格式: [code][out1,out2,out3]=myfunc(arg1,arg2)[/code] 则VB的调用应该为: [code]call object.myfunc(3,out1inVB,out2inVB,out3inVB,arg1inVB,arg2inVB)[/code] “3”指的是输出变量的数目 另外当多个版本的MATLAB在同一PC上时,VB只认其中一个版本产生的COM,不知道是不是环境变量设置的问题。 2006-3-6 09:41 lb107 Re:VB和Matlab传递数据 谢谢楼上二位的指点!! 我的想法也是利用comtool直接将m文件编译成COM组件,然后在VB中调用实现应该是没有问题,但是在交换数据方面肯呢感有点难度,我只想找几个具体的例子看看其调用的根据体过程 谢谢!! 2006-3-6 19:53 taohe Re:VB和Matlab传递数据 [quote][b]lb107 wrote:[/b] 谢谢楼上二位的指点!! 我的想法也是利用comtool直接将m文件编译成COM组件,然后在VB中调用实现应该是没有问题,但是在交换数据方面肯呢感有点难度,我只想找几个具体的例子看看其调用的根据体过程 谢谢!! [/quote] 如果用comtool也就是使用COM组件的话,事情就更好办了。因为进入COM世界后,所有的数据都是VARIANT,而VB和COM是非常亲近的关系,在VB中使用COM比起其他语言比如C++来说显得更为轻松。还得重复一下,matlab的在线帮助上关于COM组件的应用几乎全部是VB作为应用程序例子,不妨看看。2006-3-6 20:05 lb107Re:VB和Matlab传递数据 我的英语不太好 taohe 老师能给一个具体的链接地址吗?? 谢谢 2006-3-6 20:46 taohe Re:VB和Matlab传递数据 你指什么连接地址?我刚才说的在线帮助是matlab安装文档。 本来matlab的公司MathWorks的网站上有每次最新版的matlab的帮助文档连接。不过现在MathWorks网站上的连接好像已经变成新版matlab R2006a的文档了。所以只好看matlab安装后的在线帮助了。 matlab不知你用那个版本的matlab,不管那个版本,在matlab环境中运行doc,然后在出来的帮助文档中寻找相关的话题。如果是matlab6.5.x的话,应该在matlab com builder,如果是matlab7.x的话应该是matlab builder for com。 里面有例子程序,如果VB好的话,应该没有问题的。别怕英文。 可惜我是VB盲,无法给出具体的帮助。 Good luck! 2006-3-6 22:40 lb107 Re:VB和Matlab传递数据 再次谢谢 2006-3-12 21:35 godzilla2000cn Re:VB和Matlab传递数据 如果matlab中生成的图片怎么传到VB里,也就是在VB中用什么控件来接收matlab的fig??? 2006-11-1 19:46 tian7tian 大家好啊! 我现在是将m文件组成com组件,还没搞定呢,总出现错误! 2006-11-8 19:46 jimin 看了bainhome版主的一个例子后,做了个vb调用matlab时隐藏matlab figure 的例子 Private Sub Command1_Click() Dim objMATLAB As Object Set objMATLAB = CreateObject("matlab.application") Dim strEnter As String Dim strCommand As String strEnter = Chr(13) & Chr(10) strCommand = "figure('visible', 'off', 'Units','points','PaperUnits', 'points');" strCommand = strCommand & strEnter strCommand = strCommand & "surf(peaks(25));" strCommand = strCommand & strEnter strCommand = strCommand & "print -dmeta" strCommand = strCommand & strEnter strCommand = strCommand & "close(gcf)" strCommand = strCommand & strEnter objMATLAB.execute (strCommand) imgDraw.Picture = Clipboard.GetData() imgDraw.Refresh Set objMATLAB = Nothing End Sub 2006-11-12 10:42 WaitingForMe Matlab的代码或者窗口, 用combuilder编译以后, 可以直接在VB里面引用. 如果需要移植到其他计算机上, 需要在目标计算机上安装一个虚拟机, 大概8M大小. 2006-11-12 13:59 bainhome [quote]Matlab的代码或者窗口, 用combuilder编译以后, 可以直接在VB里面引用. 如果需要移植到其他计算机上, 需要在目标计算机上安装一个虚拟机, 大概8M大小.[/quote] 前一句话已经基本实现,后一句话不太明白...什么虚拟机?还是java虚拟机吗(自己感觉不像)?请教一下^_^ 2006-11-29 19:23 tian7tian 关于bainhome写的程序,我问个问题,关于 function y=numadd(x) 其中y定义为variant,x定义为double类型;是不是类型是固定的呢? x可以定义为string类型么? 2006-12-11 14:43 tian7tian 有哪位了解的话,有时间的话,给答复一下,谢谢了!! 2006-12-31 01:24 WaitingForMe [quote]原帖由[i]bainhome[/i] 于2006-11-12 13:59 发表 前一句话已经基本实现,后一句话不太明白...什么虚拟机?还是java虚拟机吗(自己感觉不像)?请教一下^_^ [/quote] Combuilder创建的程序,移植到没有安装Matlab的电脑上的时候,需要安装一个什么包,都忘了,这个是Matlab的帮助,自己看帮助吧 MATLAB COM Builder: Overview: Packaging and Distributing the Component 2007-7-20 15:53 shiwenyaboa

遗传算法的VB程序【精品毕业设计】(完整版)

遗传算法的VB程序 最近看了下遗传算法,刚看了一点,就觉得手痒,非要把程序编制出来看看效果(我现在总认为那些理论再高深,无法用计算机实现就是空话,呵呵)。下面是我调试了好久的代码,无赖没有学过数据结构&算法,程序写的很差,单效果还是出来了,高兴,和大家共同分享下成果吧。 还是一样,不想说原理,因为这里想搞个公式上去N麻烦。直接给点实际的东西。具体步骤是参考《MATLAB遗传算法工具箱及应用》(西安电子科技大学出版社)16~22页的相关说明编制的,有兴趣的同学可以去看看这本书。 在程序调试成功的同时,郁闷的是工作的事情,现在好多企业久是指名不要研究生,而我又是一个四不象,本专业是热能工程,可我本专业基本上还是本科水平,大部分时间都去自学一些杂七杂八的东西去了,比如人工智能,PLC,自动控制方面,图像处理啊,可又只是懂个皮毛,现在找工作也不知道怎么给自己定位了。有相关经历的同学可要指点我一二哦。 Option Explicit '程序实现功能:用遗传算法求函数的最大值 '作者: laviewpbt '联系方式: 'QQ:33184777 '版本:Version 1.4.0 '说明:复制请保留源作者信息,转载请说明,欢迎大家提出意见和建议 Dim N2(30) As Long '用来保存2的N次方的数据 Dim Script As Object '调用其Eval函数 Public Enum CrossOver OnePointCrossOver '单点交叉 TwoPointCrossOver '两点交叉 UniformCrossOver '平均交叉 End Enum Public Enum Selection RouletteWheelSelection '轮盘赌选择 StochasticTourament '随机竞争选择 RandomLeagueMatches '随机联赛选择 StochasticUniversalSampleing '随机遍历取样 End Enum Public Enum EnCoding Binary '标准二进制编码

vb调用matlab的四种方法

一、借助ActiveX部件 Microsoft把所有以COM为基础的技术统称为ActiveX技术。自动化是大多数ActiveX技术的基础,它可使解释性的宏语言(如VB)能够在不了解应用程序实现细节的情况下控制自动化对象。Matlab实现了ActiveX自动化服务支持,在VB下通过ActiveX自动化接口可将Matlab作为Visual Basic语言的一个ActiveX部件调用。 Matlab ActiveX自动化服务的功能主要包括在Matlab工作空间执行Matlab命令,以及直接从工作空间存取矩阵等,下面列出了Matlab自动化服务支持的几个主要方法,其参数和返回值的类型采用ActiveX自动化协议所定义的与语言无关的类型描述: ● BSTR Execute([in] BSTR Command); BSTR表示宽字符串类型,它与VB存储字符串所采用的数据格式相同。该方法接收字符串命令并在Matlab中执行,将结果以字符串形式返回。 ● void GetFullMatrix([in] BSTR Name,[in] BSTR Workspace,[in, out] SAFEARRAY(double)* pr,[in, out] SAFEARRAY(double)* pi); 该方法从指定的工作空间检索一个完整的一维或二维的实型或虚mxArray,其实部和虚部被分别存放到两个单独的Double型数组中。 ● void PutFullMatrix([in] BSTR Name,[in] BSTR Workspace,[in] SAFEARRAY(double) pr,[in] SAFEARRAY(double) pi); 该方法将一个mxArray放入指定的工作空间。各参数的含义及调用方法与GetFullMatrix方法类似。 示例代码如下: 1Dim Matlab As Object ’声明对象 2Dim MReal1(5,5) As Double ’声明存放实部的Double型数组 3Dim MImag() As Double ’声明存放虚部的Double型数组 4Set Matlab=CreateObject(“Matlab.Application”) '初始化对象 5Matlab.Execute(“a=hilb(5)”) '执行Matlab命令 6Call Matlab.GetFullMatrix(“a”,“base”,MReal1,MImag) '将结果分别存入实部、虚部数组 复制代码 二、借助DDE技术 DDE(Dynamic Data Exchange)允许Microsoft Windows应用程序通过交换数据实现彼此间的通信。应用程序间彼此通信要先建立一个DDE会话,对会话进行初始化的应用程序称为客户端(Client),对Client端作出响应的应用程序称为服务器(Server)。图1描述了Matlab 作为服务器时与其他应用程序的通信机制。

MATLAB与VB混合编程方式简易教程

3.1 MATLAB与Visual Basic 语言的混合编程方式 MATLAB提供了与C/C++、Fortran语言的接口,但没有与Vsiual Basic语言的接口,要想实现MATLAB与Visual Basic的混合编程可以通过以下途径来实现。 1.通过ActiveX方式 一是用Visual Basic开发服务器ActiveX组件,MATLAB作为客户端程序使用,事实上无论是用VB还是VC或者其他语言环境开发的ActiveX组件,对于MATLAB来说集成与调用方式是一样的,一般情况下很容易地将不同环境下开发的用途各异的ActiveX对象集成到一个MATLAB应用中来。其使用方法见第5章关于MATLAB作为ActiveX的客户端使用方法。 二是在VB环境下可以通过ActiveX自动化接口将MATLAB作为Visual Basic语言的一个ActiveX 部件调用。MATLAB ActiveX自动化服务的功能主要包括在MA TLAB工作空间执行MA TLAB 命令,以及直接从工作空间存取矩阵等,我们在第5章中关于MA TLAB作为服务器组件的部分的例子就是以Visual Basic应用程序,以MATLAB作为服务器客户端的。 2.通过动态链接库方式 该种方式是一种间接调用MATLAB命令的方式,借助于C++与MA TLAB的接口,将MATLAB 的程序文件(.M文件)编译为动态链接库(.DLL),VB在代码中与调用其他语言编写的DLL文件一样调用MATLAB中.M 文件生成的动态链接库。这种方法可以脱离具体的MA TLAB环境,运行效率较高。 3.通过嵌入VB的矩阵函数库MatrixVB的方法 MatrixVB是由第三方(mathtools公司)提供的COM组件,包含了大量与MATLAB相似的函数与调用语法,可以加强VB内建数学运算与图形展示功能,在VB程序代码中可以像使用VB自己的函数一样使用MatrixVB的函数,而且可以不依赖于MATLAB的环境在Visual Basic中完成矩阵运算与图形绘制显示等功能,这种方法使用起来简单,编程效率较高。MatrixVB函数库的功能大致可分为8大类(矩阵运算、运算符重载、图形图像处理、最优化运算、多项式、信号处理、随机与统计分析、控制系统)。 除以上3种方式外,我们还可以通过DDE的方式实现VB与MATLAB的数据通信。 3.2 MatrixVB 环境设置 3.2.1 在VB应用中引入MatrixVB

浅谈VB与MATLAB相结合的三种方法

浅谈VB与M AT LAB相结合的三种方法 樊金荣① 黎洪生② 摘 要 本文分别介绍了在VB中调用M atlab的三种方法:利用动态链接库DLL、利用动态数据交换D EE以及利用A ctivex自动化技术。并以具体的例子给出通过这些方法实现了VB的可视化界面与M atlab强大的数值计算和图形显示能力的结合。 关键词 客户 服务器 M atlab DLL DD E A ctivex 技术 一、前言 V isual Basic是由M icro s oft公司开发的在W indow s95 98平台上的一种十分强大和有生命W indow s编程语言之一,具有易学易用、编程简单、程序集成化程度高及界面可视化又能实现大多数W indow s编程目的,因而一经推出就风靡全球然而,VB提供的数学函数及其有限,因而使之在数值计算和图形显得力不人心。M atlab是M ath W o rk s公司开发的一种工程计算语言。用这个交互系统可以解决很多工程计算问题,特别当涉及到矩阵和矢量形式的问题时,M atlab提供了强大的矩阵处理的和绘图功能。显然,将二者结合起来,能实现VB 可视化界面下运用M A TLAB强大的数值计算和图形显示,使VB编更加灵活快洁。 二、采用动态链接库DLL方法 M atcom是一个从M A TLAB到C++的编译器,它可以节省用户的运算时间和内存要求。M ath too ls公司利用M atcom4技术编写了M ideva工具软件,它可以借用C++编译器将M atlab下的M-文件转换为可被VB调用的DLL或独立瓣可执行文件。VB中要使用DLL,必须在VB工程中包含DLL的声明文件(即模块文件),同时还要将DLL放在工程文件所在的目录下。 如下操作可以一个M-文件编译成DLL:启动M atcom4的M ideva,点菜单F ile Comp ile,选要转换的M-文件应该是能作为函数被其他集城环境调用的M-文件,设文件名为m yfile)。编译完成后,在对应的D ebug或R elease目录下,可以找到一些编译生成的文件。VB需要用到的文件有两个。m yfile.dll(DLL文件)m yfile.bas(在VB中声明DLL的模块文件)。事实上,m yfile.dll中的函数并不能直接与VB进行数据交换,它只能通过矩阵数据进行操作。M ah tToo ls提供了一个单独的C++库文件m atlib42.dll(相当VB集成环境与DLL之间的代理,它包含有20多个矩阵句柄操作函数和800多个从M atlab中转换来的矩阵函数)以及相应的模块文件m atlib42.bas。为了在VB中能调用这类DLL,必须将m yfile. bas和m atlib42.bas加入工程中,并将m yfil.dll和m atlib42. dll拷贝到工程所在的目录下。编译后,在VB中的函数名为m yfile-in-out,其中,in和out分别为函数的输入输出参数的个数。注意,在编程时,必须调用m t In it M来初始化库文件,即请求允许使用转换的DLL,并调用m tEx it M来结束这种请求。另外,还要使用其它的矩阵句柄函数来分配、访问和释放矩阵句柄。 这种方式最简单的例子是直接调用m atlib42.dll中提供的inv-2-1来计算矩阵的逆。 二、采用动态数据交换D EE方法 该方法是利用M A TLAB提供的客户 服务器(C lien t Server)功能,VB应用程序作为系统主控,用M atlab作为后台应用程序完成复杂计算任务与绘画功能,M atlab与VB应用程序间通过DD E协议进行数据交换,DD E(D ynam ic D ata Exchange)是一种开放的、与语言无关的、基于消息的协议,它是应用程序通过共享内存进行进程通信的一种形式。 VB应用程序首先通过确定服务器名和主题(top ic)建立与M A TLAB的DD E会话,服务器名和主题唯一地确定作为客户端,M atlab作为服务端,客户端与服务端可以就确定的项目(Ite m)交换数据。关于VB的DD E功能可以参文献。VB应用程序中需指明的M A TLAB的服务器为M atlab,, M A TLAB有Syste m和Engine两个主题,在Syste m主题下可以列出M A TLAB所提供的详细的DD E功能,在Engine主题下可以充分实现M A TLAB的服务功能。利用VB具有的DD E客户端功能,使用M A TLAB的Engine主题支持的三种操作,VB应用程序主河以向M A TLAB传送可执行的命令,从M A TLAB中读取数据以及向M A TLAB中传送数据。 VB为用户提供的支持DD E通信的控件有:窗体(Fo r m)、多文档窗体(M D I Fo r m)、标签(L abel)、文本框(T ex t Box)和图片框(P icture Box)。相应于DD E协议,这些控件提供了完成一次DD E链接需要的属性和事件,以及设置 ① ②黎洪生 武汉理工大学自动化学院 教授 博士生导师 武汉 430070 樊金荣 武汉理工大学自动化学院 硕士 武汉 430070

VB调用Matlab生成的dll完全攻略(混合编程必备)

用VB调用Matlab生成的dll MATLAB 具有强大的运算功能,VB 具有开发界面友好的特点,可以将二者结合,可以开发出脱离MATLAB 环境的VB程序,即利用VB调用Matlab生成的dll。 工具/原料 Microsft Visual Basic 6 Matlab 7.0 步骤/方法 在MA TLAB 系统中的命令输入comtool命令或点击左下角“Start- > MATLAB - > MA TLAB COMBuilder - > MATLAB COM Builder”,启动MATLAB COM Builder。 建立工程,选择菜单“File - > New Project”,设置工程参数。设置的工程名为COM 组件编译后的文件名称,也可以输入新类,点击“Add”建立新类。

点击菜单“Project - > Add File. . . ”,向工程中加入M或MEX文件。 点击菜单“Build - >COM Object. . . ”,状态窗口出现“Standalone DLL build complete.”说明生成dll成功。

注册生成的myfunc_1_0.dll,在VB中引用MWComUtil.dll和myfunc_1_0.dll,就可以像调用里边的函数了!

插入完成后,Visual Basic中的具体调用方法和命令 此时Matlab中定义的函数: function daoju_gonge(z,x,m,ha,c,b) (函数名daoju_gonge) VB调用 1.先对所有的参数进行定义(关键) Private z As Double Private x As Double Private m As Double Private ha As Double Private c As Double Private b As Double Private theDaoju As myDaoju.Daoju (theDaoju 是自己设定的一个VB中的变量,myDaoju 则是由.m文件编译而成的.dll文件文件名,同时也是其中定义的组件名Component name,daoju则是其类名Class name) 2.调用命令 Call theDaoju.Daoju_gonge(z, x, m, ha, c, b) 3.对VB进行初始化 Private Sub Form_Load() Set theDaoju = New myDaoju.Daoju End Sub 注意事项以及相应问题解决 1.在编译dll时,需要机器安装有C或C++编译器,比如安装VC++6.0 2.Matlab启动Comtool工具之前,还需要利用mbuild –setup 命令对compiler(转换器) 设 置,将转换器设置成C++/C语言对应的compiler,而不是Matlab自带的compiler。 Ps:前两条如果没有做到的话,在comtool生成界面往往出错,无法生成dll等相应的文件。 3.如果出现有其他一些小问题,尝试重启Visual Basic或Matlab,再或者重启电脑。 疑难点: 如果对文件进行处理,使其能够在其他电脑上同样实现设定的功能。 可选方案一:文件打包。 Visual Basic打包程序或是Matlab打包程序。

VB调用MATLAB混合编程教程(完整版)

VB与MATLAB混合编程探讨 摘要:介绍了VB与MATLAB混合编程的方法,二者结合可以充分利用VB的方便快捷和MATLAB软件工具箱的强大功能。 关键词:VBVC++MATLABDLL编译MATLABAdd-inMATLAB是MathWorks公司开发的科学计算环境,具有强大的计算绘图能力,提供大量的函数库、工具箱,几乎涵盖了所有的工程计算领域,被誉为“演算纸”式的工程计算工具。但是MATLAB语言是一种解释执行的脚本语言,运算速度较慢是一个比较突出的问题。 VisualBasic作为一门易学易用的编程语言,受到很多工程技术人员的青睐,其执行速度相对较快,界面友好。因此实现VB与MATLAB混合编程,可以为科研工作和工程应用提供有力的技术支持。 1基本思路及实现方法 MATLAB提供了与C++、Fortran的程序接口,并没有提供直接与VB的接口。目前VB与MATLAB混合编程方面主要使用以下一些方法: (1)在VB中通过调用MATLAB的引擎(Engine)接口,使用Windows的OLE或ActiveX通道与MATLAB通信。通过Object.Execute MATLAB语句在程序中直接使用MATLAB提供的函数库和图形库。这种方法可以较快地编写出程序;但在调用引擎时,会在后台启动一个MATLAB进程,影响程序运行速度,占用内存。 (2)通过使用嵌入VB的矩阵函数库MatrixVB的方法。MatrixVB是由原MathTools公司开发的第三方插件,利用与MATLAB相似的函数、语法嵌入到VB中,可以象使用VB的函数、命令一样使用MATLAB函数。这种方法语法和函数使用比较简单,编程效率很高,几乎完全融入VB语言,特别对图形的处理非常方便,弥补了其他方法在图形处理上的弱点。安装后,只需在打开的工程中添加MatrixVB库

基于VB调用ANSYS与MATLAB的电机电磁场计算

2006年第2期┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉ ! 设计分析"#$%&’&(’&’)*#$#┉ " """"" " " "" " "" """ " " " """ "" """"" "" " "" "" """" """ "" """基 于 " " ""调 用 """ "与 "" " " """"" """ "的电机 电 磁 场 计 算11 收稿日期:2005-04-14 改稿日期:2005-09-23 基于VB 调用ANSYS 与MATLAB 的电机电磁场计算 顿月芹1,孔 宇2 (1.清华大学,北京100084;2.山东医学高等专科学校,山东济南250000)Calculation of Electromagnetic Field by Calling ANSYS and MATLAB based on VB DUN Yue -qin 1,KONG Yu 2 (1.Tsinghua University ,Beijing 100084,China ;2.Shandong Medical College ,Jinan 250000,China ) 摘 要:介绍了一种基于VB 调用ANSYS 与MATLAB 进行电磁场计算的方法及其工作过程。借助VB 实现了可视化参数输入界面,通过调用APDL 语言编写的建模分析程序及MATLAB 的绘图程序实现了电磁场计算的一体化运 行,MATLAB 大大增强了图形的处理能力。最后以分析大气隙永磁电机的三维电磁场为例,证明了该方法的优越性,该 方法在很大程度上降低了ANSYS 的使用难度并提高了电磁场设计分析的效率。 关键词:VB ;ANSYS ;MATLAB ;电机电磁场 中图分类号:TM301.4+4;TP391 文献标识码:A 文章编号:1004-7018(2006)02-0011-03Abstract :A method of calculation of electromagnetic field by calling ANSYS and MATLAB based on VB is presented in this paper.Its operational process is introduced detailedly.The visible interface of inputting parameters is realized with VB.The calculation of electromagnetic field is finished by calling the pro-gram of APDL and the plotting one of MATLAB based on VB. The capability of dealing with figures is improved greatly with MATLAB.The analysis of a PM machine with big air -gap takes an example to validate the advantages of the method.The method decreases the difficulty of using ANSYS and increases the effi-ciency of program.Keywords :VB ;ANSYS ;MATLAB ;electric machine elec-tromagnetic field 1引 言 随着电机设计与分析的发展,有限元在电机电磁场分析中得到了广泛应用。ANSYS 是目前应用较多的有限元分析软件之一,该软件具有强大的前、后处理功能。其基本分析过程为:建模、划分网格、加载、求解和后处理 [4] 。如果模型参数变化,则要 重复执行上述步骤,操作相当复杂。ANSYS 自带的参数化设计语言APDL 可以实现参数化建模分析,避免了重复操作,但是APDL 不提供图形化界面输入,不熟悉ANSYS 软件的技术人员想轻松使用之并非一件易事。在电磁场分析方面,ANSYS 软件后处 理中得到图形的功能有限,而且当采用三维场进行分析时,存在无法得到磁力线分布的缺陷,与此相比,MATLAB 显示出了灵活的绘图功能[5]。VB 是目前较流行的应用程序的可视化开发工具[3] ,在图形用户界面开发方面具有突出的优势[3] 。由于VB 功能强大、易学易用,越来越多的人对VB 与其它软件的集成开发进行了研究[1~2] 。为了解决ANSYS 分析中所存在缺陷,笔者以分析计算电机的三维电磁场为例介绍一种基于VB 开发的ANSYS 和MATLAB 程序调用方法,实现了三者之间的无缝集成,提高了程序的开发效率。2基于VB 集成开发ANSYS 与MATLAB 2.1基本原理 ANSYS 采用参数化建模分析,便于参数的修改。VB 提供输入参数的可视化界面,由此界面可输入或修改相关参数,这些赋值后的参数被传送到ANSYS 的参数化命令流文件从而构成完整的运行程序,VB 再调用该程序分析电磁场。之后,VB 调用MATLAB 进行绘图(利用ANSYS 的后处理所得数据)处理。ANSYS 和MATLAB 经VB 调用后在后台运行程序,程序运行结束再返回到VB 界面,从而 用户只需和VB 界面打交道即可进行电磁场的分析及查看后处理结果。 2.2VB 调用ANSYS 实现参数化界面分析 文献[4]给出了一种VB 增强ANSYS 前处理能力的方法,其建立模型的命令流文件是通过VB 编程来输入,这无疑增加了VB 编程的工作量,对复杂模型来说更是如此,如果再加上求解和后处理部分难度更大,这在很大程度上掩盖了VB 编程的优点。与此不同,本文先用APDL 语言编写参数化建模分析命令流文件。然后通过VB 的读文件和写文件函数对该命令流文件进行操作,只需几行程序即可完成整个调用过程。 用APDL 编写参数化建模分析命令流文件an-sys.dat (此时没有给参数赋值),利用VB 创建可视

五种VB与MATLAB混合编程接口的方法

摘要:为充分发挥Matlab与VB各自的优势,将二者结合起来进行工程应用软件的开发。本文介绍了五种VB与MATLAB混合编程接口的方法,并对各方法性能的优劣进行了比较和评价。 关键词:Matlab;Visual Basic;ActiveX;DDE;MatrixVB;DLL;COM 1引言 Microsoft Visual Basic是由微软公司开发的可视化编程语言之一,由于它简单易学的特点,只要稍有编程基础就可以很快掌握,可视化的用户界面设计功能,把程序设计人员从繁琐复杂的界面设计中解脱出来。因而很快就风靡全球,是一种十分强大和有生命力的Windows编程语言。但是我们知道VB语言也有它的缺点,即对于数值计算方面其能力欠佳。 Matlab是Matlab擅长处理数值计算和系统模拟仿真,已被广泛应用于数字信号处理、电力系统仿真、图像处理、系统识别等各个领域。但是Matlab也存在一些缺点:1、和其他高级程序相比,程序的执行速度较慢,那是因为;2、对于底层硬件操作以及编程界面方面远远比不上VB、VC等软件。鉴于二者各自的优势,为了提高工程软件的开发效率和质量,将两种软件结合起来进行工程应用软件的开发便成了实际的需要。本文主要讨论VB与Matlab混合编程的几种方法。 2Vb和Matlab接口实现方法介绍 2.1借助ActiveX技术 ActiveX是特点就是使不同的软件对象可以跨进程、跨平台并能在网络上进行交互。Matlab ActiveX自动化服务的功能主要包括在 (1)Execute(Command as String)方法:执行本方法将调用MATLAB执行一条Command字符串决定的Matlab命令,同时返回一条字符串表示命令的执行情况。任何能在MATLAB命令行窗口执行的命令均可以被包括在Command 字符串中。 (2)GetFullMatrix方法:该方法用来将Matlab中的一个矩阵变量传送到VB程序的一个一维数组或二维数组中。

Matlab与VB_NET混合编程中数据存储方式的研究

2008 2009,30 (8)0引言 Matlab 是科学计算和工程应用的常用工具,它内置大量的函数,可以方便的用于各种数学运算。https://www.wendangku.net/doc/9712303864.html, 是一种简单易学、功能强大的程序设计语言。使用这两种工具混合编程可以利用各自的优点,减少程序开发时间,提高程序的计算能力和易用性,编写出适合各种需要的应用程序。 在我们实验室开发的SUNIST 单粒子模拟系统中,由于需要进行大量的矩阵计算,同时需要对这些计算结果进行分析和应用,所以我们使用Matlab R2007b 和https://www.wendangku.net/doc/9712303864.html, 2005作为程序开发工具。其中,使用Matlab R2007b 进行矩阵计算,使用https://www.wendangku.net/doc/9712303864.html, 2005设计人机界面、管理模拟结果。在SUNIST 单粒子模拟系统中,Matlab 和https://www.wendangku.net/doc/9712303864.html, 的数据交互和存取是一个非常重要的问题。因为在计算过程中,需要保存大量的数据用于以后的分析使用,如模拟的初始条件、粒子轨道上各点的坐标、速度、磁矩等。 Txt 文本文件和xls 文件是两种常见的文件格式,具有各自的优点。Matlab 和https://www.wendangku.net/doc/9712303864.html, 各自均可以方便的存取这两种格式的文件。虽然在Matlab 中可以通过dlmwrite 和xlswrite 函数把数据写入txt 文本文件和xls 文件,但是我们发现,无论 是将这两条语句写入.m 文件通过https://www.wendangku.net/doc/9712303864.html, 调用,还是在https://www.wendangku.net/doc/9712303864.html, 中直接调用这两个函数都无法实现数据的存储功能,只能通过其它的存储方法[1-2] 。本文将详细阐述该问题及其解 决方法。 1Matlab 和https://www.wendangku.net/doc/9712303864.html, 混合编程中通过Matlab 存储Matlab 计算结果存在的问题 在Matlab 中,函数dlmwrite 和函数xlswrite 可以将其中的矩阵变量写入txt 文本文件和xls 文件。但是,在https://www.wendangku.net/doc/9712303864.html, 和Matlab 的混合编程中,这两条语句却无法实现该存储功能。为了说明这个问题,以dlmwrite 函数建立如下的tempWrite.m 文件: tempData =random ('Normal',0,10,10,3);;%生成一个随机的10×3矩阵 dlmwrite ('tempTxt.txt',tempData,'delimiter','\t','newline','pc');%将数据写入tempTxt.txt ReadTempTxtData =dlmread ('tempTxt.txt');%读入temp-Txt.txt 中存储的10×3矩阵 figure; plot (tempData (:,1));%利用TempData 矩阵的第一列数据作图figure; 收稿日期:2008-04-18;修订日期:2008-06-12。 计算机应用技术

相关文档
相关文档 最新文档