搜档网
当前位置:搜档网 › VB调用MATLAB混合编程教程(完整版)

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

VB调用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库

即可(在工程->引用对话框中选中MMatrix)。但由于其仍然采用解释执行,执行效率较低,实时运算难以实现。

(3)借助VisualC++与MATLAB的接口,将MATLAB的程序文件(.M)编译为动态链接库(.DLL),VB在代码中调用生成的.DLL中的函数,实现算法,便于用户脱离MATLAB环境使用。由于算法部分采用C++语句,运行速度较快,可应用于实时运算。这种方法对开发者在设置和编程上有一定要求,本文将详细阐述具体实现步骤。其基本思路如图1所示。

第一步,编写M文件。在MATLAB中打开Editor,按照MATLAB程序格式输入代码,实现算法,调试成功。注意:M文件必须以Function开始,避免在VC++中出现转换错误。

第二步,使用MATLAB6.0新提供的编译插件MATLABAdd-in在VC++中转换为C文件。在转换前做好MATLAB与VC++的接口连接。步骤如下:·在MATLAB中运行“mex-setup”,选择MicrosoftVisualC/C++version6.0选项,安装MATLABAdd-in文件到VC++目录,确认;接着运行“mbuild-setup”,选择MicrosoftVisualC/C++version6.0作为本地默认编译器;然后在MATLAB下运行“cd prefdir”和“mccsavepath”命令,MATLABAdd-in可以脱离MATLAB环境找到MATLAB路径。

·在VC++中选择“工具 tools->定制(customize)->附加项和宏文件 Add-insandMacroFiles页”,选中“MATLABAdd-in”。这样,在VC++工具栏出现MATLABAdd-in图标,在VC++

新建工程对话框中会出现“MATLABProjectWizard”。至此连接工作完成。

·打开VC++,在新建工程中选择“MATLABProjectWizard”,按照提示,选择“ShalledM-dll”,输入M文件位置,VC++开始转换。如果M文件没有错误,在工程文件夹中会生成一系列.C文件。其中与M文件同名的.C文件即为转换的C代码。

第三步,编译DLL文件(强烈建议不要对刚刚生成的C代码作任何修改)。选择“编译”菜单,构建.DLL文件,在文件夹中会生成与工程名相同的DLL文件。

第四步,在VB中调用DLL文件。在第二步生成的C代码中找到所要的接口函数,注意大小写,记下函数名。在VB中使用Declare语句声明这个函数。在窗体的“通用-声明”输入如下语法:

DeclareFunction/Sub<函数名>Lib“<dll文件名>”Alias“<函数名>” <参数表>as<type>(具体语法可参看VB使用手册)。

在程序代码中直接调用声明的函数即可。需要注意的是函数调用过程中的参数传递问题。由于VB和C的数据类型以及参数传递形式不太一样,传递不当,可能会造成调试困难。特别是MATLAB中用到的大量矩阵(数组)参数,调用需十分当心。本文在下面例子中采用文件方式传递参数,利用VB和MATLAB的文件读写功能传递数组参数,对于实时性要求不高的应用,可以方便稳妥地实现数据传递。

2应用举例

在VB中利用随机数生成16个10以内的整数,作为一个信号序列,利用MATLAB的快速傅立叶变换函数(FFT())对序列进行变换,再将变换结果传递回VB,并显示在窗体上。

在MATLAB中编辑好M文件(test.m),实现读取序列文件及FFT并写回序列文件,调试成功。代码如下:

functiont

fid=fopen 't.txt' 'rt+' %以读写文本方式打开文件

acount =fscanf fid '%d' %文件以整数格式读入矩阵a

m=fft a count %FFT运算

frewind fid %文件指针指向文件头

fprintf fid '%f\n' m %向文件写入矩阵m

fclose fid

按照前述步骤在VC++中转换为test.c文件,找到接口函数,本例为mlfTest()。

voidmlfTest(void){

mlfEnterNewContext(0,0);

Mtest();

mlfRestorePreviousContext(0,0);

}

编译生成test.dll文件。

在VB中生成随机序列并写入文件:

PrivateSubCommand1_Click()

Randomize

DimiAsInteger

DimaAsInteger

DimbAsString

Text1.Text=″″

OpenApp.Path&″\t.txt″ForOutputAs#1

Fori=1To16

a=Int(10*Rnd)

Print#1,LTrim(a)

b=b&Str(a)&Chr(13)&Chr(10)

Nexti

Text1.Text=b

Close#1

EndSub

声明mlfTest()函数:

PrivateDeclareSubmlfTestLib″G \test\dll\dll.dll″

调用该函数的事件代码:

PrivateSubCommand2_Click()

MlfTest'调用函数

EndSub

本例中未向函数传递参数,也无需函数返回运算结果,故采用调用子程序过程(Sub)方式直接调用。结果由VB读取文件获得:

PrivateSubCommand3_Click()

Dimstr1AsString

Dimstr2AsString

Text2.Text=″″

OpenApp.Path&″\t.txt″ForInputAs#1

DoWhileNotEOF 1

LineInput#1 str1

str2=str2&str1&Chr(13)&Chr(10)

Loop

Text2.Text=str2

Close#1

EndSub

本例在WindowsXP、VB6.0、VC++6.0、MATLAB6.5下调试通过。VB与MATLAB的混合编程,可以脱离MATLAB环境运行,有利于程序发布及使用。通过二者结合,减少了设计算法的时间,降低了编程难度,同时兼顾了代码安全和界面友好。程序界面如图2所示。

MATLAB程序设计教程(第二版)课后答案(可编辑修改word版)

MATLAB 第二版课后答案unit3-8 unit3 实验指导 1、 n=input('请输入一个三位数:'); a=fix(n/100); b=fix((n-a*100)/10); c=n-a*100-b*10; d=c*100+b*10+a 2(1) n=input('请输入成绩'); switch n case num2cell(90:100) p='A'; case num2cell(80:89) p='B'; case num2cell(70:79) p='C'; case num2cell(60:69) p='D'; otherwise p='E'; end price=p (2)n=input('请输入成绩'); if n>=90&n<=100 p='A'; elseif n>=80&n<=89 p='B'; elseif n>=70&n<=79 p='C'; elseif n>=60&n<=69 p='D'; else p='E'; end price=p (3)try n; catch price='erroe' end 3 n=[1,5,56,4,3,476,45,6,3,76,45,6,4,3,6,4,23,76,908,6];

b=n(1); for m=2:20 if n(m)>a a=n(m); elseif n(m)=0 disp(A([n],:)); elseif n<0 disp(lasterr); else disp(A([6],:)); disp(lasterr); end 7(1) f=[];

MATLAB程序设计教程课后答案

实验指导 1、 n=input('请输入一个三位数:'); a=fix(n/100); b=fix((n-a*100)/10); c=n-a*100-b*10; d=c*100+b*10+a 2(1) n=input('请输入成绩'); switch n case num2cell(90:100) p='A'; case num2cell(80:89) p='B'; case num2cell(70:79) p='C'; case num2cell(60:69) p='D'; otherwise p='E'; end price=p (2)n=input('请输入成绩'); if n>=90&n<=100 p='A'; elseif n>=80&n<=89 p='B'; elseif n>=70&n<=79 p='C'; elseif n>=60&n<=69 p='D'; else p='E'; end price=p (3)try n; catch price='erroe' end 3 n=[1,5,56,4,3,476,45,6,3,76,45,6,4,3,6,4,23,76,908,6]; a=n(1);

for m=2:20 if n(m)>a a=n(m); elseif n(m)=0 disp(A([n],:)); elseif n<0 disp(lasterr); else disp(A([6],:)); disp(lasterr); end 7(1) f=[]; for n=1:40

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

MATLAB程序设计教程(第二版)第三章实验报告下载

大学社区网收集整理https://www.sodocs.net/doc/5110773909.html, 评分 日期湖南商学院北津学院实验报告 课程名称MATLAB科学计算编程语言 实验名称MATLAB程序设计 专业班级信科1121班 姓名xxx 学号xxx 实验日期2012年11月5日 2012—2013学年度第一学期 一、实验目的 1.掌握利用if语句、switch语句实现选择结构的方法。 2.掌握利用for语句、while语句实现循环结构的方法。 3.熟悉利用向量运算来代替循环操作的方法并理解MATLAB程序设计的特点 4.掌握定义和调用MATLAB函数的方法。

二、实验环境 系统windows7旗舰版 处理器Intel(R)Core(TM)i7-3610M CPU @ 2.30GHz 安装内存 4.00GB (3.07GB 可用)系统类型64位操作系统运行环境 MATLAB 5.3 三、实验基本原理 利用上课所学知识解决以下问题: 1.从键盘输入一个3位数的整数,将它反向输出。如输入639,输出936。 2.输入一个百分制成绩,要求输出成绩等级A、B、C、D、E。其中90~100分为A,80~89分为B,70~79分为C,60~69分为D,60分以下为E。 要求: (1)分别用if 语句和switch 语句实现。 (2)输入百分制成绩后要判断该成绩的合理性,对不合理的成绩应输出出错信息。3.输入20个数,求其中最大数和最小数。要求分别用循环结构和调用MATLAB 的max 函数、min 函数来实现。 4.23.0ln )3.0sin(23.03.0a a e e y a a +++?=?,当a 取-3.0、-2.9、-2.8、…、2.8、2.9、 3.0时,求各点的函数值。要求分别用顺序结构和循环结构实现。 5.当n 分别取100、1000、10000时,求下列各式的值: (1)) 6...(n 1...31211122222π=+++++(2)) 2...()12)(12()2)(2(...756653443122π =??? ?????+?????????××????????××????????××n n n n 要求分别用循环结构和向量运算(使用sum 函数)来实现。 6.建立5×6矩阵,要求输出矩阵第n 行元素。当n 值超过矩阵的行数时,自动转为输出矩阵最后一行元素,并给出出错信息。 7已知,o999 ) 20()30()40(f f f y += (1)当)5ln(10)(2 ++=n n n f 时,y 的值是多小。 (2)当+×+×+×=433221)(n f …+)1(+×n n 时,y 的值是多小。 8.先用函数的递归调用定义一个函数文件求 ∑=n i m i 1,然后调用该函数文件求

遗传算法的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

Matlab程序设计教程(第二版)刘卫国课后参考答案解析

第二章 1 求下列表达式的值。 (1) w=sqrt(2)*(1+0.34245*10^(-6)) (2) a=3.5; b=5; c=-9.8; x=(2*pi*a+(b+c)/(pi+a*b*c)-exp(2))/tan(b+c)+a (3) a=3.32; b=-7.9; y=2*pi*a^(2)*[(1-pi/4)*b-(0.8333-pi/4)*a] (4) t=[2,1-3*i;5,-0.65]; z=1/2*exp(2*t)*log(t+sqrt(1+t^(2))) 2 求下列表达式 A=[-1,5,-4;0,7,8;3,61,7]; B=[8,3,-1;2,5,3;-3,2,0]; (1) A+6*B A^2-B+eye (2) A*B A.*B B.*A (3) A/B B\A (4) [A,B] [A([1,3],:);B^2] 3 根据已知,完成下列操作 (1) A=[23,10,-0.778,0;41,-45,65,5;32,5,0,32;6,-9.54,54,3.14]; K=find(A>10&A<25); A(K) (2) A=[23,10,-0.778,0;41,-45,65,5;32,5,0,32;6,-9.54,54,3.14]; B=A(1:3,:) C=A(:,1:2) D=A(2:4,3:4) E=B*C (3) E

f=input('输入一个数:','s'); f(end :-1:1) 2 用if语句 score=input('请输入成绩:'); if score>=90&&score<=100 disp('A'); elseif score>=80&&score<=89 disp('B'); elseif score>=70&&score<=79 disp('C'); elseif score>=60&&score<=69; disp('D'); elseif score<60&&score>=0; disp('E'); else disp('出错'); end 用switch语句 score=input('请输入成绩:'); switch fix(score/10) case {9,10} disp('A'); case {8} disp('B'); case {7} disp('C'); case {6} disp('D'); case {0,1,2,3,4,5} disp('E'); otherwise disp('出错'); end 第四章1题 1) X=0:10; Y=x-x.^3/6; P lot(x,y)

浅谈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

matlab程序设计与应用(第二版)第三章部分课后答案

第三章1. (1)A=eye(3) (2)A=100+100*rand(5,6) (3)A=1+sqrt(0.2)*randn(10,50) (4)B=ones(size(A)) (5)A+30*eye(size(A)) (6)B=diag(diag(A)) 2. B=rot90(A) C=rot90(A,-1) 3. B=inv(A) ;A的逆矩阵 C=det(A) ;A的行列式的值 D=A*B E=B*A D=E 因此A与A-1是互逆的。 4. A=[4 2 -1;3 -1 2;12 3 0]; b=[2;10;8]; x=inv(A)*b x = -6.0000 26.6667 27.3333 5. (1) diag(A) ;主对角线元素 ans = 1 1 5 9 triu(A) ;上三角阵

ans = 1 -1 2 3 0 1 -4 2 0 0 5 2 0 0 0 9 tril(A) ;下三角阵 ans = 1 0 0 0 5 1 0 0 3 0 5 0 11 15 0 9 rank(A) ;秩 ans = 4 norm(A) ;范数 ans = 21.3005 cond(A) ;条件数 ans = 11.1739 trace(A) ;迹 ans = 16 (2)略 6. A=[1 1 0.5;1 1 0.25;0.5 0.25 2] A = 1.0000 1.0000 0.5000 1.0000 1.0000 0.2500 0.5000 0.2500 2.0000

[V,D]=eig(A) V = 0.7212 0.4443 0.5315 -0.6863 0.5621 0.4615 -0.0937 -0.6976 0.7103 D = -0.0166 0 0 0 1.4801 0 0 0 2.5365

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打包程序。

MATLAB程序设计教程课后答案.doc

MATLAB第二版课后答案unit3-8 unit3 实验指导 1、 n=input('请输入一个三位数:'); a=fix(n/100); b=fix((n-a*100)/10); c=n-a*100-b*10; d=c*100+b*10+a 2( 1) n=input(' 请输入成绩 '); switch n case num2cell(90:100) p='A'; case num2cell(80:89) p='B'; case num2cell(70:79) p='C'; case num2cell(60:69) p='D'; otherwise p='E'; end price=p (2) n=input(' 请输入成绩 '); if n>=90&n<=100 p='A'; elseif n>=80&n<=89 p='B'; elseif n>=70&n<=79 p='C'; elseif n>=60&n<=69 p='D'; else p='E'; end price=p (3) try n; catch price='erroe' end 3 n=[1,5,56,4,3,476,45,6,3,76,45,6,4,3,6,4,23,76,908,6];

a=n(1) ; b=n(1); for m=2:20 if n(m)>a a=n(m); elseif n(m)=0 disp(A([n],:)); elseif n<0 disp(lasterr); else disp(A([6],:)); disp(lasterr); end 7( 1) f=[];

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 创建可视