介绍MATLAB中的面向对象编程

由Stuart McGarrity和亚当Sifounakis,MathWorks公司

在创建软件应用程序时,重要的是将软件的各种构建块组织到相关的组中。例如,自定义数值求解器可能需要几个配置参数和例程来执行其全部计算。面向对象编程(OOP)允许您将求解程序的配置参数(属性)及其函数(方法)分组到单个定义中,或者。用户正确执行这个解算程序所需的一切都在这个类中定义。

对象是类的一个实例。当程序执行时,是基于其类定义并且表现在由类中定义的方式创建的对象。一个对象的属性表示它的状态,并且它的方法表示所有用户可以执行的操作。通过这种方式,代码作者可以轻易地将所有的软件系统和用户相关的数据和功能可以很容易地查找和使用的所有代码作者已经开发的功能。

下面的示例使用面向对象编程来构建一个应用程序,该应用程序将分析传感器阵列中的传感器数据。

应用实例:分析传感器阵列数据

传感器阵列(图1)是一组传感器,通常排列成一条线,用于对空气、水或地面等介质进行采样,用于雷达、声纳或蜂窝通信。通过从空间中的多个点收集时间样本,您可以从被采样的介质中提取额外的信息。

图1的传感器阵列检测在未知角的两个遥远电磁源。

我们的应用程序使用的传感器阵列,以确定的多个遥远电磁源,例如无线电信标和雷达发射机到达(DOA)的方向。在这种情况下,我们将试图两个源的角度θ1,θ2相对于传感器阵列所指向的方向来估计。

检查数据项和操作

对于这种应用,我们需要存储和表示下列数据:

  • 传感器和样品的数量
  • 采样传感器数据
  • 传感器采样率
  • 传感器间距
  • 远源波长
  • 波的速度
  • 传感器数据集的名称或说明

我们将使用一个简单的快速傅里叶变换(FFT)为基础的技术来估计DOA的来源。这种技术可以分解为多个部分,并作为操作的集合来实现。将实现少量实用程序操作,以帮助简化开发工作。例如,我们必须:

  • 从合成数据或获取的实时数据创建数据集
  • 检查和修改数据集值和参数
  • 绘制样本数据以帮助解释和验证
  • 计算并绘制数据集的功率谱(由平方FFT方法的简单幅度)
  • 找出功率谱的峰值来估计源的DOA

在确定我们需要来表示数据,我们需要执行的活动,我们可以代表与类属性的数据,并用类方法的活动。

代表与类属性数据

我们首先定义一个类来描述传感器阵列。这个初始表示只包含数据项,并代表他们作为类属性。

你定义MATLAB类与类定义文件,它与开始classdef关键字,并由结束关键字。在类定义块中,附加的关键字块将描述类的不同方面,如类属性和类方法。图2中所示的定义文件描述了一个类悲伤而已(传感器阵列数据集)我们需要表示的所有数据项都列在一个属性块中。

图2.类定义文件sads.m与属性。

创建对象和访问属性

创建我们定义的类的对象或实例,我们使用语句

>> s = sads;

要设置属性的值,我们指定它的名称,就像指定结构的字段一样

> >。NumSensors = 16;

我们可以显示对象,看到所有可用的属性和当前值,通过键入其名。

波长:[]c: 300000000个数字传感器:16个数字样本:[]数据:[]间隔:[]采样:[]名称:[]

除了NumSensorsC仍然是空的。现在可以将数据集标识为a悲伤而已对象使用函数,ISA功能,谁是命令,东西是不可能的结构。

>>类(s) ans = 'sads'

标识类变量的能力是谁创建的代码来对数据集进行操作,因为这让他们确定可以合法进行访问的可用数据项和操作用户来说非常重要。

错误检查

如果使用结构表示数据,则可以随时添加新字段名,只需指定新字段名并为其赋值即可。当您在试验和原型化算法时,这种功能特别方便。但是,如果您拼错了字段名,则将以静默方式添加新字段,这可能会在以后导致难以诊断的错误。

不同的结构,你不能简单地动态通过指定一个新的属性名称和分配一个值添加新属性的对象。如果你拼错一个对象的属性名称,MATLAB立即发出错误。当对象是由谁比作者,其中大型应用程序的开发过程中是常见的不太熟悉它的用户访问这个附加的错误检查的水平是非常有用的。

控制对数据的访问

类为您提供了对属性访问的强大控制。例如,它们允许禁止修改属性、隐藏属性或动态计算属性。通过在类定义文件中指定属性属性来控制对属性的访问。我们扩展了图2中的类定义文件,将当前的属性列表划分为多个属性块,每个属性块具有唯一的属性属性:GetAccess常数,依赖(图3)。

属性来禁止对属性的修改常数属性。在我们的例子中,我们将设置光属性的速度C是常数。因为常量属性不会改变,所以可以通过引用类名来访问它们。

>> sads.c ans = 300000000

属性设置为只读SetAccess私有属性。属性的设置,可以使属性仅对操作它的方法可见GetAccess属性为private,就像我们将处理的那样波长属性。

您可以自由地更改私有属性的名称或特征,而不会影响对象的用户。这种定义软件的“黑盒”方法称为封装,它可以防止对象的用户依赖于实现细节或特性,而这些细节或特性可能会更改和破坏代码。

您指定当通过设置要求,一个属性只计算其依赖属性。

然后指定在访问属性时自动调用的get方法。看到“使用Get和Set方法访问属性”有关如何指定类方法的详细信息,请参阅本文的一部分。在我们的应用程序中,我们设置了NumSensorsNumSamples要依赖的属性。

使用类方法实现操作

方法,或者可以在对象上执行的操作,被指定为在一个方法块的功能的列表。一类可以包含许多类型的方法,每个完成一个不同的目的,每个不同的指定。下面的部分描述了许多这类方法。

我们将一个方法块添加到悲伤而已定义文件,并在此块中添加每个新方法(图4)。

图4。类定义文件sads.m与方法,显示在MATLAB编辑器。为了便于观察,将码折叠功能用于隐藏许多代码。

指定一个构造函数方法

在我们的示例中,我们将指定一个构造函数方法,该方法允许用户提供用于创建对象的参数。构造函数方法通常执行数据初始化和验证。对象现在用

>> s = sads(数据、波长、采样率、间距、名称);

实现特定应用方法

我们将添加几个方法来实现要在数据集上执行的特定于应用程序的操作。obj),并通过引用该变量(例如,obj.NumSamples),如在此方法:

函数mag = [mags,fflip] = magfft(obj, zpt) mag = 0 (obj)。NumSamples、zpt);...结束

虽然它需要额外的语法,但是通过对象变量引用属性可以帮助将它们与局部函数变量区分开来,比如玛格以上。

调用方法

方法的调用与函数类似,对象作为参数之一传入。我们可以通过调用来估计源的DOA角doa类的方法。

>>角度= doa(s)角度= -10.1642 18.9953

的DOA角近似的图1中所示的源极,其是-10°和20°的真实位置。

使用Get和Set方法访问属性

可以通过指定关联的set和get方法来验证属性或实现从属属性。这里是。的get方法NumSensors属性。

函数NumSensors = get.NumSensors(obj)。2)数据;结束

获取当属性被访问set方法被自动调用,例如用

>> N = s.NumSensors;

指定具有重载的现有MATLAB函数的方法

通过在方法列表中提供具有该名称的函数,重载允许您重新定义现有的MATLAB函数来处理您的对象。在我们的应用程序中,我们将包含一个重载的情节方法,提供一个函数来可视化许多MATLAB用户熟悉的数据集(图5)。

>>图(S)

图5。重载绘图方法专门用于传感器阵列数据集。

这个定制的plot方法以最适合这个数据集的方式表示信息,并使用所有可用信息对其进行注释。它只在定义了它的对象上执行——这比操纵路径中目录的顺序要健壮得多。

如果您想要类的特殊行为,您还可以重载基本操作符,甚至通过使用具有特殊名称的方法来建立索引。

进一步开发应用程序

我们在本示例中创建的类表示我们的传感器阵列数据集,并允许我们很容易地对我们的数据中,包括主测向操作执行复杂,专业分析。快速评估在不同情况下的基于FFT技术的性能,我们可以使用这个类。

我们可以使用额外的OO技术来扩展应用程序。例如,我们可以这样做:

  • 使用继承定义现有类的子类(重用更广泛类别的定义来定义更特定的子类)
  • 指定静态方法,让我们为整个类定义一个操作
  • 使用具有引用行为的句柄类,使我们能够创建像链表这样的数据结构,或者在不复制数据集的情况下处理大型数据集
  • 定义事件和监听器,让我们监视对象属性或操作

这些技术提高我们通过使我们能够进一步定义应用程序中的关系和行为,以管理复杂性的能力。

因为它是使用面向对象的技术构建,现在的应用程序是足够强大的供他人使用和维护,可以与整个组织的其他应用程序集成。

2020年出版的


查看相关功能的文章

查看相关行业的文章