简析MATLAB和NET混合编程_第1页
简析MATLAB和NET混合编程_第2页
简析MATLAB和NET混合编程_第3页
简析MATLAB和NET混合编程_第4页
简析MATLAB和NET混合编程_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

这个是我写的一篇关于MATLAB课程的作业,作业已提交。所以,ChenGuangda老师看到了请不要以为我的作业是从网上抄的,哈哈。0■背景MATLAB作为一款功能强大、效率高、交互性好的可视化高级计算机语言,在数值计算、自动控制、数字信号处理、图形处理、仿真、神经网络、小波分析等各个领域有着广泛的应用。虽然MATLAB是一个完全独立的编程和数据运算的集成环境使用它可以很方便地做很多工作,但是,很多时候仅仅依靠MATLAB环境还是不能很好地完成工作,例如一个大的项目中需要使用到MATLAB中很容易实现而且很有些的功能时,如果这个时候使用特定语言开发,将会是一个费时费力的事情,而且稳定性、效率方面都不如MATLAB好;或者,其他语言编写的优秀程序,如果想在MATLAB中使用,就要重写M文件,造成了人力和物力的浪费,所以MATLAB和其他程序之间的数据交换就显得十分必要,MATLAB程序接口的出现,就解决了这些问题,通过接口与其他编程环境交互,各取所长,充分发挥MATLAB计算的优点,而避开MATLAB效率低的问题。1.MATLAB的接口MATLAB提供了多种编程语言的接口,通过微软的组建对象模型(ComponentObjectModel,COM)完成外部程序、客户端和服务端之间的通讯和数据共享,这些功能的实现都是使用了MATLAB的应用程序接口(ApplicationProgramInterface,API)来实现的。下图是MATLAB提供的接口。/MAl'LAliMATLABCompiier379010987.blogMATLAB曲血帖E/MAl'LAliMATLABCompiier379010987.blogMATLAB曲血帖E乂MATLABBuilderJAV wV ]、r:IfvI|Excel| |砂|匸囲379@10987.bltM?fe3^arrMATLABBuLderNEMATLAB使用自身强大的编译器可以将MATLAB的应用程序编译为一个独立的程序(.exe)或者组件(.dll),这些组件又能够被Fortran、C、C++等高级语言调用,实现了和其他程序之间的交互;通过使用MATLABBuilderEX,将MATLAB的函数打包为组件,这样就能够能被Excel使用;通过使用MATLABBuilderJA,可以由MATLAB程序创建Java语言中的类,这些类完全可以在没有安装MATLAB的桌面计算机或者网络服务器上运行。通过使用MATLABBuilderNE,将MATLAB函数封装入.NET中类的方法,这些类就可以像其他托管代码一样被.NET环境下的所有语言调用,例如C#、VB.NET、J#、C++.NET、F#等语言,甚至是网络程序也可以调用,例如ASP.NET。2•外部语言的选取由上节可见MATLAB的编程接口是相当丰富的,这里就.NET方式讨论,使用.NET的接口有如下几个优点:代码安全。作为托管代码,不会出现指针带来的问题,这就保证了程序的稳定性容错机制。C#中具有异常处理方法,因此即使程序在运行中出现了错误,也能从故障中快速恢复,或者提供较好的摆脱异常的方法,而不是像其他程序那样造成程序崩溃。面向对象。通过将函数打包为一个类的方法,实现了完整的面向对象编程,方便了代码的阅读和管理,并能够实现面向对象中的重载、继承、多态等功能。2.1什么是.NET•NET的定义,根据微软官方的描述:.NETisa"revolutionarynewplatform,builtonopenInternetprotocolsandstandards,withtoolsandservicesthatmeldcomputingandcommunicationsinnewways”。.NET是微软公司的一组软件技术,用来连接信息、人、系统和各种设备。它通过使用WebServices技术来获得软件的高度集成。除了将小型的、分散的、构建模块应用互相连接起来,还将Internet上的更大应用连接起来。微软总裁兼首席执行官SteveBallmer把它定义为:.NET代表一个集合,一个环境,一个可以作为平台支持下一代Internet的可编程结构。•NET的核心部分是.NETFramework,这是一组框架,是.NET的核心支持库,.NETFramework提供CLR(公共语言运行时)提供了对各种程序的支持,通常将在CLR的控制下运行的代码,称为托管代码(managedcode)。使用.NET开发的程序需要在.NETFramework下才能运行,就像VB的程序需要VB运行库,,ava程序需要JVM(Java虚拟机)一样。下图是.NETFramework的架构:C#C++VB.NETCommonLanguageSpecificationASP.NET:WebServiceAnd<sua-studiozETC#C++VB.NETCommonLanguageSpecificationASP.NET:WebServiceAnd<sua-studiozET通过使用VisualStudio.NET开发工具,可以使用多种语言开发,采用CLS(公共语言规范)后,编译为中间语言,这种语言是专门针对公共语言的,和其他高级语言无关,因此,高级语言可以在这个层面上实现融合和互通,这也是.NET架构的一大优势,也是其成功的关键因素。最后,在CLR(公共语言运行时)提供的支持,从而在操作系统上运行。MATLABBuilderNE就是将M文件编译为位于BasicClassLibrary同一层,实现了程序的运行2.2语言的选择首先需要明白的是,NETFramework只是一个平台,并不是一种具体的编程语言,实际开发过程中需要有一种具体的语言和对应的工具,根据微软的构想,在推出.NET架构的同时,还是推出了一款专门针对该平台的语言一一#,该语言是纯粹面向对象的,并能最大化地释放.NET平台的优势,实现了软件的安全、快速开发。另外,根据上图可知,使用的开发工具是VisualStudio.NET,微软旗舰级的开发工具VisualStudio也升级到了2010版,该开发工具是一套可视化的编程环境,其强大的功能,如自动代码、智能感知、错误高亮、代码重构等功能,使程序开发起来事半功倍。3■如何实现混合编程如前面所说,混合编程有一个很显著的问题,就是最终的程序以何种方式实现。这涉及到了两种实现方。首先,可以将NET程序在MATLAB中运行,这个时候MATLAB是宿主程序,而.NET程序以一种插件的方式存在,共享MATLAB的内存空间;另一种方式是将NATLAB程序编译为托管代码,然后在C#的程序中调用,这个时候就脱离了MATLAB的环境,可以形成独立的软件。使用MATLAB的.NET接口这种方式是以MATLAB为主程序,-NET程序以插件的方式为MATLAB调用,该方法对MATLAB的要求很简单,基本不需要做任何改动。事实上MATLAB天然的提供了对.NET程序的支持。通过使用这种方式,可以实现:1..NET中类的实例。2•通过使用类成员操作.NET程序。当然,这种方法和一般的面向对象还是有一些局限性,例如不能访问子类,不能将.NET对象保存到MAT文件中,也不能使用控制台输入、输出等。事实上,使用这种方式开发的人员,更多的是.NET程序员,他们无需关心MATLAB是如何实现的,也用不着和MATLAB打交道,只需要在编程中能够将自己的接口暴露给MATLAB即可,当然了电脑上必须安装.NETFramework才能实现。下面是一个简单的例子:例如在MATLAB的命令窗口中输入:>>dt=System.DateTime(2011,5,11)运行结果为:dt=System.DateTimePackage:System

Properties:Date:[1x1System.DateTime]Day:11DayOfWeek:[1x1System.DayOfWeek]DayOfYear:131Hour:0Kind:[1x1System.DateTimeKind]Millisecond:0Minute:0Month:5Now:[1x1System.DateTime]UtcNow:[1x1System.DateTime]Second:0Ticks:634406688000000000TimeOfDay:[1x1System.TimeSpan]Today:[1x1System.DateTime]Year:2011MinValue:[1x1System.DateTime]MaxValue:[1x1System.DateTime]Methods,Superclasses为什么是这个结果?首先,MATLAB在启动的时候会自动加载程序集System.dll(另一个是mscorlib.dll),该程序集是.NET中非常重要的文件之一,提供了基本类型、数学计算等功能。而DateTime就是其中的一个结构体,该结构体主要用于描述时间。使用该结构体创建了一个实例dt,然后调用的构造函数是DateTime(year,month,day),MATLAB显示关于该实例的基本信息,并在最后还提供显示该结构体方法和超类的链接。如果再输入:>>dt.Year则显示:ans=2011这里就访问了.NET代码中的属性。事实上,MATLAB提供了专门的函数查看托管类的属性和方法。例如输入:>>propertiesSystem.DateTime和>>methodsSystem.DateTime就可以查看一个结构体或者类支持的方法和属性。3.2如何开发自定义类虽然.NET提供了大量的类和方法,但是并不能满足实际工作中的需要,有时需要自己开发一些自定义的类,使用VisualStudio.NET将会很轻松地实现开发。在VS中新建一个类库的项目,在Class1.cs中输入如下内容:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Windows・Forms;namespaceToMATLAB{publicclassXDClass{//这是一个不带返回值的方法publicvoidMessage(){MessageBox.Show("HereisDotNet~");}//这是一个属性publicstringHelp{get{return"IamaPropertyofClassXDClass";}}〃这是一个带返回值的方法,利用海伦公式计算三角形面积publicdoubleTriangleArea(doublea,doubleb,doublec){doublemax=a;if(max<b)max=b;if(max<c)max=c;if(2*max>=a+b+c)return-1;//不构成三角形else{doublep=(a+b+c)/2;returnMath.Sqrt(p*(p-a)*(p-b)*(p-c)}}}}然后按F6编译生成一个名为ToMATLAB.dll文件,该文件就是被MATLAB加载的.NET程序集。然后在MATLAB的CommandWindow中输入:>>asmInfo=NET.addAssembLy('C:\Users\Castor\Desktop\ToMATLAB・dLL')效果如下:asmInfo=NET.AssemblyhandlePackage:NETPropertiesforclassNET.Assembly:AssemblyHandleClassesStructuresEnumsGenericTypesInterfacesDelegatesNET.addAssembly函数加载一个.NET的程序集,即编译生成的动态链接库文件加载完成后可以通过Properties函数或者methods函数查看其属性和方法。运行如下:>>propertiesToMATLAB.XDClassPropertiesforclassToMATLAB.XDClass:Help>>methodsToMATLAB.XDClassMethodsforclassToMATLAB.XDClass:EqualsMessage• XDClass eqgelenotifyGetHashCodeToString addlistenerfindobjgtltGetTypeTriangleAreadeletefindpropisvalidne可见MATLAB能够识别我们编写的方法和属性,下面测试一下属性和方法:>>xd=ToMATLAB.XDClass()xd=ToMATLAB.XDClasshandlePackage:ToMATLABProperties:Help:[1x1System.String]Methods,Events,Superclasses>>xd.Helpans=IamaPropertyofClassXDClass>>xd.Message>>xd.Messagexd.Message>>xd.TriangleArea(3,4,5)ans=6>>xd・TriangleArea(3,4,1)ans=-1当运行到Message的时候,会出现一个对话框:■Hereis.DotNe^t—JI这是使用了.NET中的MessageBox.Show方法的原因,另外要注意的是,该对话框是有模式的对话框,这个时候编译器会挂起,虽然在CommandWindow下可以输入命令,但是却不能被编译器解释,这是模式对话框的一个显著特点。最后调用了xd实例的方法,利用海伦公式计算一个三角形的面积,当提供的三个参数不能构成三角形的时候,计算结果为-1,其实这个时候应该理解为错误代码,显然面积应该是一个正数,通过检查该值可以判断方法是否正确运行。4■外部程序调用MATLAB函数相比前一种方式,这种方法实施起来显得有些复杂,但是可扩展更大,这种方式可以完全脱离MATLAB环境,实现软件的快速开发。在实施这一混合编程之前,需要先介绍独立于MATLAB的程序一些基本问题的。MCR简介MCR的全称是MATLABCompilerRuntime,即MATLAB编译器运行时。根据MathWorks公司的定义:TheMATLABCompilerRuntime(MCR)isanexecutionenginemadeupofthesamesharedlibrariesMATLABusestoenabletheexecutionofMATLABfilesonsystemswithoutaninstalledversionofMATLAB.可见MCR是一个由MATLAB共享类库构成的执行引擎,他能够使MATLAB文件在没有MATLAB的机器上运行。这一点和.NETFramework相对于.NET程序一样,即为程序的运行提供了底层支持。当发布程序的时候,需要将MCR也打包进来,否则没有MATLAB的机器上程序不能执行,如同.NET程序不能在没有.NETFramework的机器上运行一样。MCR随MATLAB软件一同发布,可以在MATLAB中输入命令“mcr”或者“mcrinstaller”获取其保存路径:>>mcrTheWIN32MCRInstaller,version7.14,is:D:\MATLAB\toolbox\compiler\deploy\win32\MCRInstaller.exeMCRinstallersforotherplatformsarelocatedin:D:\MATLAB\toolbox\compiler\deploy\<ARCH><ARCH>isthevalueofCOMPUTER('arch')onthetargetmachineFulllistofavailableMCRinstallers:D:\MATLAB\toolbox\compiler\deploy\win32\MCRInstaller.exeFormoreinformation,readyourlocalMCRInstallerhelp.OrseetheonlinedocumentationatTheMathWorks'website.(Pagemayloadslowly.)根据上面的运行结果,可知该文件的完整路径是:D:\MATLAB\toolbox\compiler\deploy\win32\MCRInstaller.exe。MWArrayAPI简介MCR包含了文件MWArray.dll,该文件中的API承担了用户程序和MCR之间数据交换的任务,因此,每一个独立文件都需要包含对该文件的引用,否则程序就不能使用MATLAB中的函数,为使用该文件,需要先安装MCR,该文件在安装完MCR后位于:installation_folder\toolbox\dotnetbuilder'bin\architecture\framework_version另外,该文件中有两个重要的命名空间,MathWorks.MATLAB.NET.Arrays和MathWorks.MATLAB.NET.Utility,Arrays命名空间下的类提供从其他任何兼容CLS(CommonLanguageSpecification)语言访问MATLAB中数组的功能,这些类支持数组格式化、类型的特定索引和错误处理的功能。而Utility命名空间下的类提供了对MWArray类架构和MATLAB公共运行时的托管API的通用支持。43混合编程的实施为了将MATLAB中的程序作为组件提供给其他.NET程序使用,需要做两方面的工作:1•将M文件打包为与.NET兼容的程序集2•在外部程序中添加对程序集的引用4・3・1MATLAB端的工作首先是将M文件打包为程序集。MATLAB将函数作为某个类中的方法,通过对类的操作实现对函数的调用。首先准备好函数,这些函数需要保存在M文件中,例如MATLAB中的函数SVD很强大,而我们不想自己重写,或者对幻方比较感兴趣,也不知道具体如何事实,但是在MATLAB下面只要一个函数就能解决,这些功能对外部程序就很有用,下面是这两个M文件:%函数[.矩阵的SVD分解function[u,s,v]=XDSVD(A)[u,s,v]=svd(A);end%函数2•生成幻方矩阵functionm=XDMagic(n)m=magic(n);

end假设这两个文件分别保存为XDSVD.m和XDMagic.m,下面将其打包为.NET兼容的组件。这就需要使用deploytool命令:在MATLAB的命令窗口中输入:>>deploytool将出现如下对话框,设置好项目名,并指定目标组件的形式是.NETAssembly,然后确定。机DeploymentProjecthlewOpenhlewOpenOKOKCancel在DeploymentTool中添加一个名为Functions的类,并为该类添加我们事先准备好的两个M文件。

这个时候XDMagic和XDSVD函数将作为Functions类的方法而存在,这个时候就可以点击开始编译了,不过在编译之前,还需要说说Package标签下的一些细节。由上图可见,该标签页下会显示编译之后的文件,下方还有一个链接是AddMCR,该功能是将MCRInstaller.exe也作为程序的组件打包进去,如果使用这个方式,编译程序会变得很大(不添加才1KB,如果添加会变为173MB),会显著增加编译时间,实际上更好的方法是,不添加MCR,而是另外单独拷贝,这样部署起来更方便灵活。编译完成之后或生成一个和项目同名的文件夹,其中最重要的文件就是distrib文件夹下的Castor.dll,该文件就是提供给其他.NET程序调用的类库。通过反编译程序可以查看它的成员方法,如下图:publi匚匸匚Fundtions:IDi^po^ableffFieldsprivatebooldisposed;privatestaticMWMCRmcr;//MethodsstaticFunctionsQ;publicFunctioncQ;publicvoidDi^poscQ;protectedvirtualvoidDispose(booldisposing];protectedoverridevoidFinalizeQ;publicvoidWaitForFiguresTcDieQ;publicMWArrayXDMagicQ;publicMWArrayXDMagic[MWArrayn]:publicMWArray[]XDMagic(intnumArgsOut);publicMWArrayf]XDMagic(intnumArgsOutjMWArrayn)jpublicvoidXDMagic(intnumArgsOutdrefMWArrayCargsQut,MWArrayl]args[nJ;publicMWArrayXDSVDQ;publicMWArrayXDEVDCMWArrayA}:publicMWArrayDXD£VD[intnuiYiArgs.Qutl,publicMWArray[]XD£VD^intnumArgs-Ou^MWArrayA);public:vcidXD£VD(intnumArgsOutjrefNIWArrayD目irgsDut」MWArrayOargsln^;4.3.2.NET主程序编程接下来的工作就是如何在外部程序中使用该程序集。还是以C#为例,创建一个Windows窗口程序。添加必须的控件,然后添加对MWArray.dll和Castor.dll的引用以及加入需要的命名空间。程序界面如下:核心代码如下:privatevoidbutton1_CLick(objectsender,EventArgse){Functionsf=newFunctions。;MWNumericArrayna=null;MWArray[]arrl=null;MWArray[]arr2=null;inti=Convert.ToInt16(textBox2.Text);arrl=f.XDMagic(1,i);try{arr2=f.XDSVD(3,arr1[0]);//返回三个数组MessageBox.Show(arr2[0]・ToString(),"矩阵U:");MessageBox.Sho

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论