这个是我写的一篇关于MATLAB课程的作业,作业已提交。所以,ChenGuangda老师看到了请不要以为我的作业是从网上抄的,哈哈。0.背景MATLAB作为一款功能强大、效率高、交互性好的可视化高级计算机语言,在数值计算、自动控制、数字信号处理、图形处理、仿真、神经网络、小波分析等各个领域有着广泛的应用。虽然MATLAB是一个完全独立的编程和数据运算的集成环境使用它可以很方便地做很多工作,但是,很多时候仅仅依靠MATLAB环境还是不能很好地完成工作,例如一个大的项目中需要使用到MATLAB中很容易实现而且很有些的功能时,如果这个时候使用特定语言开发,将会是一个费时费力的事情,而且稳定性、效率方面都不如MATLAB好;或者,其他语言编写的优秀程序,如果想在MATLAB中使用,就要重写M文件,造成了人力和物力的浪费,所以MATLAB和其他程序之间的数据交换就显得十分必要,MATLAB程序接口的出现,就解决了这些问题,通过接口与其他编程环境交互,各取所长,充分发挥MATLAB计算的优点,而避开MATLAB效率低的问题。1.MATLAB的接口MATLAB提供了多种编程语言的接口,通过微软的组建对象模型(ComponentObjectModel,COM)完成外部程序、客户端和服务端之间的通讯和数据共享,这些功能的实现都是使用了MATLAB的应用程序接口(ApplicationProgramInterface,API)来实现的。下图是MATLAB提供的接口。MATLAB使用自身强大的编译器可以将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的定义,根据微软官方的描述:.NETisarevolutionarynewplatform,builtonopenInternetprotocolsandstandards,withtoolsandservicesthatmeldcomputingandcommunicationsinnewways。.NET是微软公司的一组软件技术,用来连接信息、人、系统和各种设备。它通过使用WebServices技术来获得软件的高度集成。除了将小型的、分散的、构建模块应用互相连接起来,还将Internet上的更大应用连接起来。微软总裁兼首席执行官SteveBallmer把它定义为:.NET代表一个集合,一个环境,一个可以作为平台支持下一代Internet的可编程结构。.NET的核心部分是.NETFramework,这是一组框架,是.NET的核心支持库,.NETFramework提供CLR(公共语言运行时)提供了对各种程序的支持,通常将在CLR的控制下运行的代码,称为托管代码(managedcode)。使用.NET开发的程序需要在.NETFramework下才能运行,就像VB的程序需要VB运行库,java程序需要JVM(Java虚拟机)一样。下图是.NETFramework的架构:通过使用VisualStudio.NET开发工具,可以使用多种语言开发,采用CLS(公共语言规范)后,编译为中间语言,这种语言是专门针对公共语言的,和其他高级语言无关,因此,高级语言可以在这个层面上实现融合和互通,这也是.NET架构的一大优势,也是其成功的关键因素。最后,在CLR(公共语言运行时)提供的支持,从而在操作系统上运行。MATLABBuilderNE就是将M文件编译为位于BasicClassLibrary同一层,实现了程序的运行2.2语言的选择首先需要明白的是,NETFramework只是一个平台,并不是一种具体的编程语言,实际开发过程中需要有一种具体的语言和对应的工具,根据微软的构想,在推出.NET架构的同时,还是推出了一款专门针对该平台的语言——C#,该语言是纯粹面向对象的,并能最大化地释放.NET平台的优势,实现了软件的安全、快速开发。另外,根据上图可知,使用的开发工具是VisualStudio.NET,微软旗舰级的开发工具VisualStudio也升级到了2010版,该开发工具是一套可视化的编程环境,其强大的功能,如自动代码、智能感知、错误高亮、代码重构等功能,使程序开发起来事半功倍。3.如何实现混合编程如前面所说,混合编程有一个很显著的问题,就是最终的程序以何种方式实现。这涉及到了两种实现方。首先,可以将.NET程序在MATLAB中运行,这个时候MATLAB是宿主程序,而.NET程序以一种插件的方式存在,共享MATLAB的内存空间;另一种方式是将NATLAB程序编译为托管代码,然后在C#的程序中调用,这个时候就脱离了MATLAB的环境,可以形成独立的软件。3.1使用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:SystemProperties: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{returnIamaPropertyofClassXDClass;}}//这是一个带返回值的方法,利用海伦公式计算三角形面积publicdoubleTriangleArea(doublea,doubleb,doublec){doublemax=a;if(maxb)max=b;if(maxc)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:HelpmethodsToMATLAB.XDClassMethodsforclassToMATLAB.XDClass:EqualsMessageXDClasseqgelenotifyGetHashCodeToStringaddlistenerfindobjgtltGetTypeTriangleAreadeletefindpropisvalidne可见MATLAB能够识别我们编写的方法和属性,下面测试一下属性和方法:xd=ToMATLAB.XDClass()xd=ToMATLAB.XDClasshandlePackage:ToMATLABProperties:Help:[1x1System.Str