简析MATLAB和NET混合编程

上传人:gao****ang 文档编号:210967221 上传时间:2023-05-18 格式:DOCX 页数:20 大小:276.79KB
收藏 版权申诉 举报 下载
简析MATLAB和NET混合编程_第1页
第1页 / 共20页
简析MATLAB和NET混合编程_第2页
第2页 / 共20页
简析MATLAB和NET混合编程_第3页
第3页 / 共20页
资源描述:

《简析MATLAB和NET混合编程》由会员分享,可在线阅读,更多相关《简析MATLAB和NET混合编程(20页珍藏版)》请在装配图网上搜索。

1、这个是我写的一篇关于MATLAB课程的作业,作业已提交。所以,ChenGuangda 老师看到了请不要以为我的作业是从网上抄的,哈哈。0背景MATLAB作为一款功能强大、效率高、交互性好的可视化高级计算机语言, 在数值计算、自动控制、数字信号处理、图形处理、仿真、神经网络、小波分析 等各个领域有着广泛的应用。虽然MATLAB是一个完全独立的编程和数据运算 的集成环境使用它可以很方便地做很多工作,但是,很多时候仅仅依靠MATLAB 环境还是不能很好地完成工作,例如一个大的项目中需要使用到MATLAB中很 容易实现而且很有些的功能时,如果这个时候使用特定语言开发,将会是一个费 时费力的事情,而且稳

2、定性、效率方面都不如MATLAB好;或者,其他语言编 写的优秀程序,如果想在MATLAB中使用,就要重写M文件,造成了人力和物 力的浪费,所以MATLAB和其他程序之间的数据交换就显得十分必要,MATLAB 程序接口的出现,就解决了这些问题,通过接口与其他编程环境交互,各取所长, 充分发挥MATLAB计算的优点,而避开MATLAB效率低的问题。1.MATLAB 的接口MATLAB提供了多种编程语言的接口,通过微软的组建对象模型(Component Object Model,COM)完成外部程序、客户端和服务端之间的通 讯和数据共享,这些功能的实现都是使用了 MATLAB的应用程序接口(Appl

3、ication Program In terface,API)来实现的。下图是MATLAB提供的接口。/ MAlLAliMATLAB Compii er379010987. blogMATLAB 曲血帖E 乂MATLAB Builder JAVw V、r : I fv I| Excel | 砂 | 匸囲379 10987. bltM?fe3arrMATLABBuLderNEMATLAB使用自身强大的编译器可以将MATLAB的应用程序编译为一个独立 的程序(.exe)或者组件(.dll),这些组件又能够被Fortran、C、C+等高级语言调 用,实现了和其他程序之间的交互;通过使用MATLAB

4、Builder EX,将MATLAB 的函数打包为组件,这样就能够能被Excel使用;通过使用MATLAB Builder JA, 可以由MATLAB程序创建Java语言中的类,这些类完全可以在没有安装 MATLAB的桌面计算机或者网络服务器上运行。通过使用MATLAB Builder NE, 将MATLAB函数封装入.NET中类的方法,这些类就可以像其他托管代码一样 被.NET环境下的所有语言调用,例如C#、VB.NET、J#、C+.NET、F#等语言, 甚至是网络程序也可以调用,例如ASP.NET。2外部语言的选取由上节可见MATLAB的编程接口是相当丰富的,这里就.NET方式讨论,使 用

5、.NET的接口有如下几个优点:代码安全。作为托管代码,不会出现指针带来的问题,这就保证了程序的稳 定性容错机制。C#中具有异常处理方法,因此即使程序在运行中出现了错误,也 能从故障中快速恢复,或者提供较好的摆脱异常的方法,而不是像其他程序那样 造成程序崩溃。面向对象。通过将函数打包为一个类的方法,实现了完整的面向对象编程, 方便了代码的阅读和管理,并能够实现面向对象中的重载、继承、多态等功能。2.1什么是.NET NET的定义,根据微软官方的描述:.NET is a revoluti on ary new platform,built on ope n In ter net protocols

6、 and sta ndards, with tools and services that meld computi ng and com muni cati ons in new ways”。.NET是微软公司的一组软件技术,用来连接信息、人、系统和 各种设备。它通过使用Web Services技术来获得软件的高度集成。除了将小型 的、分散的、构建模块应用互相连接起来,还将In ter net上的更大应用连接起来。 微软总裁兼首席执行官Steve Ballmer把它定义为:.NET代表一个集合,一个 环境,一个可以作为平台支持下一代Internet的可编程结构。NET的核心部分是.NET F

7、ramework,这是一组框架,是.NET的核心支持 库,.NET Framework提供CLR (公共语言运行时)提供了对各种程序的支持, 通常将在CLR的控制下运行的代码,称为托管代码(managed code)。使用.NET开发的程序需要在.NET Framework下才能运行,就像VB的程序需要VB运行 库,ava程序需要JVM(Java虚拟机)一样。下图是.NET Framework的架构:C#C+VB.NETCommon Language SpecificationASP.NET:Web Service Anddt=System.DateTime(2011,5,11)运行结果为:d

8、t =System.DateTimePackage: SystemProperties:Date:1x1 System.DateTimeDay:11DayOfWeek:1x1 System.DayOfWeekDayOfYear:131Hour:0Kind:1x1 System.DateTimeKindMillisecond:0Minute:0Month:5Now:1x1 System.DateTimeUtcNow:1x1 System.DateTimeSecond:0Ticks:634406688000000000TimeOfDay:1x1 System.TimeSpanToday:1x1 S

9、ystem.DateTimeYear:2011MinValue:1x1 System.DateTimeMaxValue:1x1 System.DateTimeMethods, Superclasses为什么是这个结果?首先,MATLAB在启动的时候会自动加载程序集System.dll (另一个是mscorlib.dll),该程序集是.NET中非常重要的文件之一, 提供了基本类型、数学计算等功能。而DateTime就是其中的一个结构体,该结 构体主要用于描述时间。使用该结构体创建了一个实例dt,然后调用的构造函数 是DateTime(year,month,day),MATLAB显示关于该实例的基

10、本信息,并在最 后还提供显示该结构体方法和超类的链接。如果再输入:dt.Year则显示:ans =2011这里就访问了.NET代码中的属性。事实上,MATLAB提供了专门的函数查 看托管类的属性和方法。例如输入:propertiesSystem.DateTime和methodsSystem.DateTime就可以查看一个结构体或者类支持的方法和属性。3.2如何开发自定义类虽然.NET提供了大量的类和方法,但是并不能满足实际工作中的需要,有 时需要自己开发一些自定义的类,使用Visual Studio.NET将会很轻松地实现开 发。在VS中新建一个类库的项目,在Class1.cs中输入如下内容:

11、using System;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.WindowsForms;namespaceToMATLABpublic class XDClass/这是一个不带返回值的方法public void Message()MessageBox.Show(Here is Dot Net);/这是一个属性public string Helpgetreturn I am a Property of Class XDClass;这是一个带返回值的方法,利用海伦公式计算三角形面积public double Tr

12、iangleArea(double a,doubleb,double c) double max = a;if (max b) max = b;if (max = a + b + c)return -1;/不构成三角形elsedouble p = (a + b + c) / 2;returnMath.Sqrt(p * (p - a) * (p - b) * (p - c)然后按F6编译生成一个名为ToMATLAB.dll文件,该文件就是被MATLAB 加载的.NET程序集。然后在MATLAB的Comma nd Win dow中输入:asmInfo =NET.addAssembLy(C:User

13、sCastorDesktopToMATLABdLL)效果如下:asmInfo =NET.Assembly handlePackage: NETProperties for class NET.Assembly:AssemblyHandleClassesStructuresEnumsGenericTypesInterfacesDelegatesNET.addAssembly函数加载一个.NET的程序集,即编译生成的动态链接库文件 加载完成后可以通过Properties函数或者methods函数查看其属性和方法。运 行如下:propertiesToMATLAB.XDClassProperties

14、for class ToMATLAB.XDClass:HelpmethodsToMATLAB.XDClassMethods for class ToMATLAB.XDClass:Equals MessageXDClasseqgelenotifyGetHashCodeToStringaddlistenerfindobjgtltGetTypeTriangleArea deletefindpropisvalidne可见MATLAB能够识别我们编写的方法和属性,下面测试一下属性和方法:xd=ToMATLAB.XDClass()xd =ToMATLAB.XDClass handlePackage: To

15、MATLABProperties:Help: 1x1 System.StringMethods, Events, Superclassesxd.Helpans =I am a Property of Class XDClassxd.Messagexd.Messagexd.Messagexd.TriangleArea(3,4,5)ans =6xdTriangleArea(3,4,1)ans =-1当运行到Message的时候,会出现一个对话框:Here is. Dot NetJI这是使用了.NET中的MessageBox.Show方法的原因,另外要注意的是,该对 话框是有模式的对话框,这个时候编

16、译器会挂起,虽然在Comma nd Win dow下 可以输入命令,但是却不能被编译器解释,这是模式对话框的一个显著特点。最 后调用了 xd实例的方法,利用海伦公式计算一个三角形的面积,当提供的三个 参数不能构成三角形的时候,计算结果为-1,其实这个时候应该理解为错误代码, 显然面积应该是一个正数,通过检查该值可以判断方法是否正确运行。4外部程序调用MATLAB函数相比前一种方式,这种方法实施起来显得有些复杂,但是可扩展更大,这种 方式可以完全脱离MATLAB环境,实现软件的快速开发。在实施这一混合编程之前,需要先介绍独立于MATLAB的程序一些基本问题的。4.1 MCR简介MCR的全称是MA

17、TLAB Compiler Run time,即MATLAB编译器运行时。根据 MathWorks公司的定义:The MATLAB Compiler Runtime (MCR) is an execution engine made up of the same shared libraries MATLAB uses to enable the execution of MATLAB files on systems without an installed version of MATLAB.可见MCR是一个由MATLAB共享类库构成的执行引擎,他能够使MATLAB 文件在没有MATLAB

18、的机器上运行。这一点和.NET Framework相对于.NET程 序一样,即为程序的运行提供了底层支持。当发布程序的时候,需要将MCR也 打包进来,否则没有MATLAB的机器上程序不能执行,如同.NET程序不能在没 有.NET Framework的机器上运行一样。MCR随MATLAB软件一同发布,可以 在MATLAB中输入命令“mcr”或者“mcrinstaller”获取其保存路径:mcrThe WIN32 MCR Installer, version 7.14, is:D:MATLABtoolboxcompilerdeploywin32MCRInstaller.exeMCR install

19、ers for other platforms are located in:D:MATLABtoolboxcompilerdeploy is the value of COMPUTER(arch) on the target machineFull list of available MCR installers:D:MATLABtoolboxcompilerdeploywin32MCRInstaller.exeFor more information, read your local MCR Installer help.Or see the online documentation at

20、 The MathWorks web site. (Page may load slowly.)根据上面的运行结果,可知该文件的完整路径是:D:MATLABtoolboxcompilerdeploywi n32MCR In staller.exe。4.2 MWArray API 简介MCR包含了文件MWArray.dll,该文件中的API承担了用户程序和MCR之间 数据交换的任务,因此,每一个独立文件都需要包含对该文件的引用,否则程序 就不能使用MATLAB中的函数,为使用该文件,需要先安装MCR,该文件在安 装完MCR后位于:in stallati on _foldertoolboxdot

21、netbuilderb inarchitectureframework_versi on 另外,该文件中有两个重要的命名空间,MathWorks.MATLAB.NET.Arrays和 MathWorks.MATLAB.NET.Utility, Arrays命名空间下的类提供从其他任何兼容 CLS(Common Language Specification)语言访问 MATLAB 中数组的功能, 这些类支持数组格式化、类型的特定索引和错误处理的功能。而Utility命名空间 下的类提供了对MWArray类架构和MATLAB公共运行时的托管API的通用支 持。43混合编程的实施为了将MATLAB中

22、的程序作为组件提供给其他.NET程序使用,需要做两方面的 工作:1将M文件打包为与.NET兼容的程序集2在外部程序中添加对程序集的引用431 MATLAB端的工作首先是将M文件打包为程序集。MATLAB将函数作为某个类中的方法,通过对 类的操作实现对函数的调用。首先准备好函数,这些函数需要保存在M文件中, 例如MATLAB中的函数SVD很强大,而我们不想自己重写,或者对幻方比较感 兴趣,也不知道具体如何事实,但是在MATLAB下面只要一个函数就能解决, 这些功能对外部程序就很有用,下面是这两个M文件:%函数.矩阵的SVD分解function u,s,v=XDSVD(A)u,s,v=svd(A)

23、;end%函数2生成幻方矩阵function m=XDMagic(n)m=magic(n);end假设这两个文件分别保存为XDSVD.m和XDMagic.m,下面将其打包为.NET兼 容的组件。这就需要使用deploytool命令:在MATLAB的命令窗口中输入:deploytool将出现如下对话框,设置好项目名,并指定目标组件的形式是.NET Assembly, 然后确定。机 Deployment ProjecthlewOpenOKCancel在Deployment Tool中添加一个名为Functions的类,并为该类添加我们 事先准备好的两个M文件。这个时候XDMagic和XDSVD函数

24、将作为Functions类的方法而存在,这 个时候就可以点击开始编译了,不过在编译之前,还需要说说Package标签下 的一些细节。由上图可见,该标签页下会显示编译之后的文件,下方还有一个链接是Add MCR,该功能是将MCRInstaller.exe也作为程序的组件打包进去,如果使用这 个方式,编译程序会变得很大(不添加才1KB,如果添加会变为173MB),会 显著增加编译时间,实际上更好的方法是,不添加MCR,而是另外单独拷贝, 这样部署起来更方便灵活。编译完成之后或生成一个和项目同名的文件夹,其中最重要的文件就是 distrib文件夹下的Castor.dll,该文件就是提供给其他.NET

25、程序调用的类库。通 过反编译程序可以查看它的成员方法,如下图:publi匚匸匚 Fundtions : IDipoableff Fieldsprivate bool disposed;private static MWMCR mcr;/ Methodsstatic FunctionsQ;public FunctioncQ;public void DiposcQ;protected virtual void Dispose(bool disposing;protected override void FinalizeQ;public void WaitForFiguresTcDieQ;publi

26、c MWArray XDMagicQ;public MWArray XDMagicMWArray n:public MWArray XDMagic(int numArgsOut);public MWArrayf XDMagic(int numArgsOutj MWArray n)jpublic void XDMagic(int numArgsO utd r ef MWArrayC argsQut, MWArrayl args nJ; public MWArray XDSVDQ;public MWArray XDEVDCMWArray A:public MWArrayD XDVDint nuiY

27、iArgs.Qutl,public MWArray XDVDint numArgs-Ou MWArray A);public: vcid XDVD(int numArgsOutj ref NIWArrayD 目irgsDutMWArrayO argsln;4.3.2 .NET主程序编程接下来的工作就是如何在外部程序中使用该程序集。还是以C#为例,创建 一个Windows窗口程序。添加必须的控件,然后添加对MWArray.dll和Castor.dll 的引用以及加入需要的命名空间。程序界面如下:核心代码如下:private void button1_CLick(object sender, Ev

28、entArgs e) Functions f = new Functions。;MWNumericArrayna = null;MWArray arrl = null;MWArray arr2 = null;inti = Convert.ToInt16(textBox2.Text);arrl = f.XDMagic(1, i);tryarr2 = f.XDSVD(3, arr10);/返回三个数组MessageBox. Show(arr20ToString(),矩阵 U:);MessageBox. Show(arr21 ToString(),矩阵S:); MessageBox.Show(arr

29、22.ToString(),矩阵 V:);catch (Exception exc)MessageBox.Show(出现异常,原因是:+ exc.Message, 错误,MessageBoxButtons.OK, MessageBoxIcon.Error);private void button2_Click(object sender, EventArgs e) Functions f = new Functions。;MWNumericArrayna = null;MWArray ansArray = null;inti = Convert.ToInt16(textBox2.Text);a

30、nsArray=f.XDMagic(1,i);na = (MWNumericArray)ansArray0;/ 只有一个数组返回MessageBox.Show(na.ToString();4.3调试运行程序运行效果如下(假设输入的参数是5): 幻方:17241B15235714164613202210121921311L&2529矩阵U、S、V分别如下:矩阵u :-0.4472-0.54550.51170.1954-0.449S-0.4472-0.4493-0.1954-0.51170.545&-0.4472-0.-0000-0.62250.62250.0000-0,44720,4498-0,

31、1954-0,5117-0,5456-0.44720.54560.51170.19540.4493-0.44720.40450.2465-0.66270.3693-0.4472-0.00560.&6270.24&6-0.5477-0.4472O.B2O2-0.0000-0.00000.3563-0,4472-0,0056-06627-0,2466-0,5477-0.4472-0.4045-0.24&60.66270.3693矩阵甘:这个结果和MATLAB下运行的效果是一样的。最后提一下一个小问题,就 是程序在初始化自定义类Functions时会花费较多时间,大约持续23秒钟,程 序如同假死一般,但第二次点击按钮反应却很快,可以推断程序集是动态加载的。5总结通过对MATLAB混合编程环境的论述和实例讲解,阐述了.NET和MATLAB 交互使用的方法,缩短了项目开发的周期,提高了算法的准确度,具有很重要的 实践意义。

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!