Object-oriented programming(面向对象编程)应用于软件开发过程中,它是建立在对事物科 学分类和描述基础上的编程方法。采用面向对象方法可以使系统各部分各司其职、各尽所能。为编程人员敞开了一扇大门,使编程的代码更简洁、更易于维护,并且具有更强的可重用性。
这篇文章通过实例介绍了MATLAB面向对象编程的技术。这些实例是用Matlab 7.6 开发的,即2008a。
面向对象编程的语言
当创建应用软件时,你所要描述的类别或事物可能是实际的对象,如汽车或是一个有机体,可能是一个虚拟实体,如金融市场,也可能是信息,如一组测试结果。在面向对象的程序设计中,这些类别以“类”的概念表达。数据元素或状态表示为类的属性,而对它们的操作则作为类的方法来实现。
对象是类的具体实例,当程序执行时,对象是基于它所属的类及在此类中定义的属性所创建的。存储在MATLAB变量中的值都属于一个类。这些值不仅包括你可能通常会考虑的对象,如时间序列或状态空间对象,也包括双精度数。
MATLAB中的类
在MATLAB中,可以通过whos命令来查看变量的类,用此命令同时也能看到变量其它的属性。实例中包括double, char, int8, struct, and timeseries。
>> a=1;
>> str=’Hello’;
>> whos
Name Size Bytes Class Attributes
a 1x1 8 double
str 1x5 10 char
应用实例:分析传感器阵列数据
图1中是一个传感器阵列,通常排列成直线,用来检测空气,水,或地面雷达,声纳,移动通信等信息。通过从空间多点收集时间样本,就能从采样的介质中提取更多的信息。
在此我们使用传感器阵列检测多个远距离的电磁源如无线导航台、雷达发射机传来的方向(DOA)。在一定的情况下,我们将设法估计这两个电磁源相对传感器阵列指向的夹角θ1和θ2。
图1 用传感器阵列检测未知角度的两个远距离的电磁源
回顾数据项目及其操作
首先我们回顾需要表示的数据项和需要实现的操作。
在大多数应用中,我们必须存储并且跟踪数据,以执行需要的操作。在实例中,我们需表示以下数据:
我们将使用一个简单的基于FFT技术来估计电磁源的DOA。这一技术可被分解为多个部分,可以将它看作是一系列操作的集合。例如我们首先需要进行如下的一些操作:
现在我们就可以决定什么需要用类的属性去表示以及什么需要用类的方法去实现。
表示具有类属性的数据
我们首先定义一个类来描述传感器阵列。这些初始化的表示仅仅包括数据项目,而这些数据项目是以类的属性来表示的。
在MATLAB中是用类定义文件来定义一个类的,类定义文件包括用关键字表示的代码模块和描述类不同属性的结束语句。图2所示就是一个定义文件,它描述了一个名为sads的类(即传感器阵列数据集合),类中包含了我们需要表示的所有数据项目,它们被列在属性模块中。
图2 带属性的类定义文件sads.m
创建一个对象并且访问属性
用下面的语句可以创建一个对象或是我们已经定义的类的一个实例
>>s=sads;
如果想设置属性值,我们可以像访问结构字段一样获取它的名字,并修改其属性值
>>s.NumSensors=16;
键入对象名之后便可以查看所有可设置的属性和当前的值。
>>s
s =
sads
properties:
NumSensors: 16
NumSamples: []
Data: []
SampleRate: []
Spacing: []
Wavelength: []
c: 300000000
Name: []
list of methods
除了NumSensors和c之外其它的属性都为空。在MATLAB基本工作空间中双击对象后,我们可以使用变量编辑器查看或编辑其属性,就像它们是结构中的字段一样(见图3)。
此时数据集合就是类sads的一个对象,对象属性可以是isa函数、whos命令或是一些结构没有的功能。
>> class(s)
ans =
sads
当创建代码的用户操作这些数据集合时对变量类的识别就显得很重要,因为用户需要通过类才能访问和正确地操作变量。
错误检查
在使用结构表示数据时,可以在任何时候添加新的字段名,只要定义了新的字段名并赋上它的值就可以了。有了此功能当我们在搭建算法或在算法样板时就特别方便。但是,如果拼错了字段名称,那么便自动地添加了一个新的字段名,如果由此出了错那么很难被检测到。
不同于结构的这种方式,在类的使用中,我们并不能简单通过定义新的属性名和它的值就能添加新的属性给对象。如果拼错了对象的属性名,MATLAB会立即识别出错误来。这种检错能力十分有用,特别是对编程环境不是很熟又在开发大的应用程序的用户。
数据访问的控制
类给了用户很大的权限去访问其属性。例如,用户可以禁止对属性的修改,隐藏属性或是被动态地计算。在类的定义文件中用户可以通过对属性的设置控制对它的访问。
在图2中我们通过将现有属性列表分为多个属性块的方法详述了类定义文件,每一个都有唯一的属性值:GetAccess, Con¬stant, 及 Dependent (见图4)。
图4 带有属性值的类定义文件sads.m
用户可以通过设置Constant属性值来禁止对属性的修改。在我们的实例中,可以设置光速c为constant。因为constant属性不会被改变,它们仅仅通过类的名字就可以被访问。
>> sads.c
ans =
300000000
用户如果设置SetAccess为私有则属性只能读不能写。如果设置GetAccess为私有则属性仅对方法操作可见,实例中的波长属性就可以这样设置。
用户可以自由改变私有属性得名称或特性,而不影响对象的使用者。这种定义代码的“黑盒”方法就是封装,这样用户就不用依赖代码实现的细节,也有效防止了用户的错误修改。
用户可以通过设置Dependent来指定属性当在调用时仅做计算。用户接着可以指定当属性被访问时自动调用的方法。详细地有关如何指定类方法可参考文章中“访问带有Get和Set方法的属性”一节。在我们的实例中,NumSensors和NumSamples属性被设置为是相互依赖的。
实现带类方法的操作
在对象上能被执行的方法或操作在方法模块中以一列函数的形式指定。类包含不同类型的方法,每一个实现不同的目的,每一个的定义也不同。下面的内容描述了一系列不同类型的方法。
我们给sads定义文件添加一个方法集模块,并将每个新的方法添加到这个模块中(见图5)。
图5 在MATLAB编辑器中显示的是带方法的类定义文件sads.m,其代码可隐藏,也可展开查看。
指定一个构造器方法(Constructor Method)
在我们的实例中,为了使用户能够在创建的对象中添加参数,我们指定一个构造器方法。构造器方法通常执行数据的初始化和确认。现在我们创建的对象包含了以下内容:
>>s=sads( Data, Wavelength, SampleRate, Spacing, Name);
实现特殊应用的方法
我们将添加几个方法以实现在数据集合上特殊应用的操作。绝大多数的方法将对象看作是输入参数(例如,obj),并通过变量来访问对象的属性(例如,obj.NumSamples),如这个方法:
function [mags,fflip]=magfft(obj, zpt)
mag=zeros(obj.NumSamples, zpt);
...
end
虽然还有其它的语法要求,但是通过对象变量参考的属性有助于将它们同本地函数变量区分开来,就像上面的mag一样。
调用方法
方法的调用同函数的调用类似,只要将对象作为输入变量其中之一即可。我们调用绘制周期图形的方法(见图6),除了对象这个输入参数外,它还需要其它的输入参数:
>>magfftplot(s,128)
图6 角度周期图形
下面,我们调用执行估计电磁源DOA主要操作的方法
>>angles=doa(s)
angles =
-10.1642 18.9953
DOA角度同图2中所示的峰值的方位是匹配的,也近似于在图1中所示的电磁源的真实方位,即 和 。
用Get和Set方法访问属性
如前面所提到的,用户能够通过指定关联的set和get方法确认属性或实现它所依赖的属性。这里get方法是针对NumSensors属性。
Function NumSensors=get.NumSensors(obj)
NumSensors=size(obj.Data,2)
end
当访问属性时Get和set方法被自动调用,例如
>>N=s.NumSensors;
给重载函数指定方法
重载使用户能够通过再次定义对象中的MATLAB函数,也可以通过使用特定名称的方法重载操作甚至是索引。在我们的实例中,包括一个重载绘图的方法,即通过大家熟悉的plot函数可视化数据集合(见图7)。
>>plot(s)
图7 针对传感器阵列数据集合的重载plot方法
定制的plot方法描述了这个数据集合在绝大数适当方式下的信息。plot方法仅在对象上执行,相比路径中目录顺序的操作有更可靠的方法去控制多个同名函数中的哪一个函数被调用.
进一步开发应用
在例子当中创建的类描述了传感器阵列数据集合,并提供了用来分析数据的几个操作,其中包括寻找主要方向的操作。我们使用类评估在不同情况下基于FFT技术的性能。
我们使用其它的面向对象的技术可以扩展这方面的应用,例如:
这些技术使我们能够进一步定义应用中的关系和行为,从而提高了我们解决复杂问题的能力。
由于使用了面向对象的技术,增加了软件的可重用性和可维护性。
面向对象编程术语表
更多信息
MATLAB中有关类开发视频指南 www.mathworks.com/oop_video
MATLAB面向对象技术交流平台 www.mathworks.com/oop_wireless
MATLAB与C++、Java及其它语言的对比例程 www.mathworks.com/oop_redblack
MATLAB类使用文档 www.mathworks.com/oop_doc
传感器应用代码 www.mathworks.com/dlcode1_0308
面向对象编程资料www.mathworks.com/products/matlab/object_oriented_programming.html
原帖:http://www.hirain.com/newsletter/ArticleShow.asp?ArtID=2171