相关图片如下: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进程,影响程序运行速度,占用内存。(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下运行“cdth”命令,MATLABAdd-in可以脱离MATLAB环境找到MATLAB路径。·在VC++中选择“工具d-insandMacroFilesAdd-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并写回序列文件,调试成功。代码如下:functiontfid=fopen%以读写文本方式打开文件%文件以整数格式读入矩阵am=fft%FFT运算frewind%文件指针指向文件头fprintf%向文件写入矩阵mfclose按照前述步骤在VC++中转换为test.c文件,找到接口函数,本例为mlfTest()。voidmlfTest(void){mlfEnterNewContext(0,0);Mtest();mlfRestorePreviousContext(0,0);}编译生成test.dll文件。在VB中生成随机序列并写入文件:PrivateSubCommand1_Click()RandomizeDimiAsIntegerDimaAsIntegerDimbAsStringText1.Text=″″OpenApp.Path&″\t.txt″ForOutputAs#1Fori=1To16a=Int(10*Rnd)Print#1,LTrim(a)b=b&Str(a)&Chr(13)&Chr(10)NextiText1.Text=bClose#1EndSub声明mlfTest()函数:PrivateDeclareSubmlfTestLib″Gll\dll.dll″调用该函数的事件代码:PrivateSubCommand2_Click()MlfTest'调用函数EndSub本例中未向函数传递参数,也无需函数返回运算结果,故采用调用子程序过程(Sub)方式直接调用。结果由VB读取文件获得:PrivateSubCommand3_Click()Dimstr1AsStringDimstr2AsStringText2.Text=″″OpenApp.Path&″\t.txt″ForInputAs#1DoWhileNotEOFLineInput#1str1str2=str2&str1&Chr(13)&Chr(10)LoopText2.Text=str2Close#1EndSub本例在WindowsXP、VB6.0、VC++6.0、MATLAB6.5下调试通过。VB与MATLAB的混合编程,可以脱离MATLAB环境运行,有利于程序发布及使用。通过二者结合,减少了设计算法的时间,降低了编程难度,同时兼顾了代码安全和界面友好。程序界面如图2(见回复)所示。工业生产中经常遇到复杂的数据信息处理问题,需要大运算量的矩阵计算及对分析结果进行实时、直观的图形化显示。Matlab是集数值分析、矩阵运算、信号处理和图形显示于一体的高性能数学软件,将其强大的计算功能与VB在图形用户界面开发方面的优势结合起来,实现应用系统的无缝集成,对于有效缩短开发周期、优化系统性能是十分有意义的。下面将分别讨论Matlab与VB集成的四种方法。一、借助ActiveX部件Microsoft把所有以COM为基础的技术统称为ActiveX技术。自动化是大多数ActiveX技术的基础,它可使解释性的宏语言(如VB)能够在不了解应用程序实现细节的情况下控制自动化对象。Matlab实现了ActiveX自动化服务支持,在VB下通过ActiveX自动化接口可将Matlab作为VisualBasic语言的一个ActiveX部件调用。MatlabActiveX自动化服务的功能主要包括在Matlab工作空间执行Matlab命令,以及直接从工作空间存取矩阵等,下面列出了Matlab自动化服务支持的几个主要方法,其参数和返回值的类型采用ActiveX自动化协议所定义的与语言无关的类型描述:●BSTRExecute([in]BSTRCommand);BSTR表示宽字符串类型,它与VB存储字符串所采用的数据格式相同。该方法接收字符串命令并在Matlab中执行,将结果以字符串形式返回。●voidGetFullMatrix([in]BSTRName,[in]BSTRWorkspace,[in,out]SAFEARRAY(double)*pr,[in,out]SAFEARRAY(double)*pi);该方法从指定的工作空间检索一个完整的一维或二维的实型或虚mxArray,其实部和虚部被分别存放到两个单独的Double型数组中。●voidPutFullMatrix([in]BSTRName,[in]BSTRWorkspace,[in]SAFEARRAY(double)pr,[in]SAFEARRAY(double)pi);该方法将一个mxArray放入指定的工作空间。各参数的含义及调用方法与GetFullMatrix方法类似。示例代码如下:DimMatlabAsObject’声明对象DimMReal1(5,5)AsDouble’声明存放实部的Double型数组DimMImag()AsDouble’声明存放虚部的Double型数组SetMatlab=CreateObject(“Matlab.Application”)’初始化对象Matlab.Execute(“a=hilb(5)”)’执行Matlab命令CallMatlab.GetFullMatrix(“a”,“base”,MReal1,MImag)’将结果分别存入实部、虚部数组二、借助DDE技术DDE(DynamicDataExchange)允许MicrosoftWindows应用程序通过交换数据实现彼此间的通信。应用程序间彼此通信要先建立一个DDE会话,对会话进行初始化的应用程序称为客户端(Client),对Client端作出响应的应用程序称为服务器(Server)。图1描述了Matlab作为服务器时与其他应用程序的通信机制。图1借助DDE时应用程序通信机制图1借助DDE时应用程序通信机制其中,DDE功能函数既可以由应用程序提供,也可以由Matlab引擎库提供。初始化会话时,客户端应用程序必须指定两个参数servicename(服务器应用程序的名称)和topic(会话主题)。下面的示例说明了VB与Matlab建立并完成DDE会话的全过程:说明:TextInput是输入文本框,TextOutput是输出文本框。在TextInput中输入Matlab命令回车后,由Matlab在后台执行并将结果返回给TextOutput显示。SubTextInput_KeyPress(KeyAsciiAsInteger)IfKeyAscii=vbKeyReturnthen’初始化TextInput与Matlab间的DDE会话TextInput.LinkMode=vbLinkNoneTextInput.LinkTopic=“MATLAB|Engine”