对象行为 - 在 MATLAB 中

2025 年 7 月 24 日 | 阅读 9 分钟

引言

MATLAB 提供了一个强大的面向对象编程 (OOP) 工具,用户可以在其中使用 MATLAB 定义类和对象、变量和函数,并通过将数据封装到类中并使用方法来确定与该类对象关联的行为,从而将数据与代码分离。作为 MATLAB 中的一项功能,OOP 除了可以重用编码函数外,还可以更轻松地以有序且可读的方式编写复杂的程序。它帮助开发人员实现大型项目,他们必须将代码结构化为可重用的组件。MATLAB 使用基于类的面向对象编程,支持继承、封装和多态,以设计可靠的应用程序。

句柄对象在 MATLAB 中的作用

没有什么比句柄更重要的了;事实上,MATLAB OOP 严重依赖它们,特别是对于那些需要共享数据、在对象之间通信或使用所提事件的人。句柄类派生自 MATLAB 的句柄类,生成作为引用的对象。这意味着当您可以将句柄对象分配或传递给变量或函数时,它不会复制该对象。相反,它保留一个指向原始对象的指针。因此,通过一个引用对句柄对象所做的修改会影响对句柄对象的所有其他引用。

这种行为特别适用于需要相同数据实例进行修改且无法预先安排更改的情况,例如在 GUI 中,按钮和其他显示必须共享数据,或者在模拟中,模型的不同部分需要相同的数据。文件名句柄也用于管理无法复制的资源,例如文件句柄、套接字或实际系统设备。

在 MATLAB 编程中使用句柄对象的优点

  • 高效的内存使用:由于句柄对象使用引用而不是复制整个值,因此在其上操作的对象可能会消耗更少的内存,并且对于大型数据集或复杂对象可能是有益的。
  • 数据共享:由于处理程序允许程序的不同部分操作相同的数据实例,因此它们通常被称为句柄对象。这种共享行为在应用程序中至关重要,因为可能存在对相同数据的并发并行访问,例如 GUI 小部件,它们需要同时反映和更新共享数据。
  • 事件处理和侦听器:句柄中的事件和侦听器类允许应用程序中的事件驱动管理,以及响应对象属性更改的能力。此功能在交互式系统中找到了应用,例如,GUI 中某些事件(例如,用户点击)需要其他操作或更改。
  • 生命周期管理:句柄对象具有明确的生命周期;它们可以使用 MATLAB 中存在的“delete”命令创建和删除。
  • 增强的灵活性和交互性:在动态应用程序中,当对象状态必须响应用户输入或数据处理而更改时,句柄对象提供了一种更具适应性的代码形式。这使得它们非常适合实时、模拟和控制应用程序,其中响应时间和数据一致性发挥着重要作用。

MATLAB 中的句柄类

1. 句柄类的组织框架

在 MATLAB 中,句柄类通过使用关键字 `classdef` 定义,并且类始终继承自 MATLAB 固有 'handle' 类。此继承允许此类实例指向实际对象,而不是将它们作为副本进行处理。当处理大量数据、对象需要将状态信息从一个函数传递到另一个函数,或者对象正在处理 GUI 或其他外部数据时,此引用行为最有用。

2. 创建句柄类的语法

在 MATLAB 中,要将特定类称为句柄类,您首先键入 `classdef` 关键字。在类名之后,您添加 `` 使其成为句柄类,它将从 `handle` 超类创建。

语法大纲

  • Java 和 JavaScript 之间的区别包括:`properties` 块声明 数据变量,任何给定的类实例都将包含这些变量。
  • 事件字段,以事件块(可选)的形式给出,指示可能由组件或侦听器发出和响应的触发器。

3. 主要组成部分

字段是包含特定于类的数据的变量。在句柄类中,一个对象的所有属性值将与引用同一对象的另一个对象的属性值相同。Access、Dependent 和 Constant 是 MATLAB 的属性,它们控制属性的可访问性。

示例

  • 方法定义为与句柄类关联的行为。
  • 它涵盖了构造函数方法,涉及初始化对象的属性。
  • 一对特殊的方法,Setter 和 Getter 方法,它们在设置/获取属性时控制/指示特定行为。
  • 与给定类关联的方法,而不是与该类的对象关联的方法。

构造函数示例

  • 事件:交互可以使对象(例如元素或区域)向程序的另一个组件发出通知。这在交互式应用程序中特别有用,例如 GUI,其中用户输入可能导致特定输出。

事件声明示例

4. 简单句柄类定义示例

以下是句柄类定义和简单类的示例,其中显示了属性、构造函数方法和事件的存在。

  • 属性 `Name` 和 `Value`:这些存储与实例相关的数据。这种类型的存储用于存储与实例相关的数据。
  • 构造函数:如果给定名称,则使用该名称初始化对象,如果值为非空,则提供该值。

句柄类中的对象生命周期和行为

在 MATLAB 中,句柄对象对于面向对象编程非常重要,它们最明显的用途是当数据必须保持持久性、应用程序必须表现出交互性或在内存方面保持高效时。理解句柄对象的生命周期、复制行为和内存管理实践可以避免可能影响程序员的问题,例如内存泄漏。

1. 创建和初始化句柄对象

句柄的创建和初始化是两个相关但不同的过程。创建是指为新的句柄对象提供数据结构,而初始化是指准备此新的句柄对象以供使用。

在定义句柄类时,对象通过构造函数创建,并将其置于初始状态。MATLAB 使用 classdef 关键字定义类,对于句柄类,必须继承一个称为 handle 的超类。构造函数定义了一个与类同名的函数,并且准确的初始化在此处进行。

示例

2. 句柄类与值类的复制行为

MATLAB 中句柄类和值类之间的另一个关键区别是指在调用类构造函数后或将变量用作函数参数时创建的变量的行为。

  • 句柄类:句柄对象是引用。在将项传递给另一个变量或作为参数传递给函数时,只复制对象的链接。这意味着通过一个引用进行的任何修改都会影响指向同一对象的所有其他引用。

示例

  • 值类:另一方面,值类在分配给新变量时创建新副本。文档的一个副本不会影响其他副本,尽管可以进行更改。

3. 删除句柄对象和内存管理

  • 删除句柄对象:`delete` 函数是用于从内存中显式释放给定句柄对象的函数。当调用 `delete` 时,它会保留下来,MATLAB 将删除该对象,任何尝试对其进行操作都将产生错误。

示例

  • 自动删除:如果句柄对象没有任何引用,MATLAB 会自动将其删除。例如,假设句柄对象是函数的局部变量。在这种情况下,当函数执行返回时,MATLAB 会释放此内存,前提是此函数外部不存在指向该对象的其他变量。

4. 关键函数:`copy` 和 `delete`

  • `delete` 函数:如前所述,`delete` 函数从内存中删除对象。这必须谨慎进行,因为对已删除对象的任何引用都会导致运行时错误。
  • `copy` 函数:对于句柄对象,MATLAB 没有显式的 copy 函数,原因是句柄对象基于引用原理操作。

自定义 `copy` 方法示例

MATLAB 中的句柄对象数组和数组操作

1. 创建句柄对象数组

句柄对象本身是对象类,但句柄对象数组是指向句柄对象的指针数组。

  • 语法示例:假设我们有一个句柄类,比如 `MyHandleClass`。要开发此类的对象数组
  • 预分配数组:句柄数组也可以预分配,这样可以通过首先初始化空数组然后添加对象来解决大型对象数组的内存分配问题。

2. 句柄对象的常见数组操作

  • 索引和访问对象:标准 MATLAB 索引仅适用于句柄对象数组。
  • 切片:与数值数组一样,切片允许选择对象数组的某些部分。
  • 调整数组大小:有几种方法可以调整数组大小,其中之一是连接。

3. 跨对象数组应用方法和操作

  • 使用 `arrayfun`:`arrayfun` 函数的操作方式与 `each` 相同,但它支持返回元素值并将此方法应用于数组中每个元素的方法。
  • 基于循环的操作:如果方法更改对象属性或状态,则更可能适用循环。

向量化属性访问和修改

4. 处理对象数组中的删除和修改

  • 删除对象:可以使用 delete 方法和 MATLAB 中执行的元素操作从句柄对象数组中删除对象。
  • 基于条件的删除:但是,程序员也可以根据每个条件删除对象。
  • 更新对象:更改可以单独完成,也可以通过分组活动完成。

下一个主题Z 变换 - matlab