MATLAB - 对象复制



在 MATLAB 中使用对象时,了解它们在复制操作中的行为至关重要。MATLAB 对象分为两类:句柄对象和值对象。这两种类型之间的区别会影响对象的副本如何管理以及对一个副本的更改如何影响其他副本。

值对象的行为类似于数组或数值等基本数据类型,其中每个副本都是一个独立的实体。对一个副本的更改不会影响任何其他副本。

另一方面,句柄对象通过引用进行操作。句柄对象的副本不会创建新的独立实例;相反,它们引用相同的底层对象。因此,通过一个句柄引用进行的修改可以通过对同一对象的 所有其他引用可见。

了解这些行为对于在 MATLAB 中进行有效的编程至关重要,尤其是在管理复杂数据结构并确保代码按预期运行时。

让我们更详细地了解值对象。

值对象

MATLAB 中的值对象的操作方式类似于数字和数组等基本数据类型。复制值对象时,副本是完全独立的实体。对一个副本进行的任何修改都不会影响该对象的任何其他副本。这种行为确保每个副本都保持其状态,不受对其他副本的更改的影响。

例如,考虑一个值对象 A。如果您创建 A 的副本 B,则 A 和 B 将作为单独的实例存在。对 B 执行的任何操作都不会影响 A,反之亦然。

值对象示例

classdef ValueClass
    properties
        Property1
    end
end

obj1 = ValueClass;
obj1.Property1 = 10;
obj2 = obj1; % Create a copy of obj1

obj2.Property1 = 20; % Modify obj2

% obj1 remains unchanged
disp(obj1.Property1); % Output: 10
disp(obj2.Property1); % Output: 20

句柄对象

另一方面,句柄对象的功能不同。句柄对象通过句柄变量引用,复制此变量不会创建新的独立对象。相反,句柄变量的所有副本都指向相同的底层对象。因此,通过一个句柄变量进行的任何更改都会反映在引用同一对象的 所有其他句柄变量中。

例如,如果 H1 是一个句柄对象,而 H2 是 H1 的副本,则 H1 和 H2 都引用相同的对象。因此,对 H2 执行的操作在通过 H1 访问对象时会立即可见。

句柄对象示例

classdef HandleClass < handle
    properties
        Property1
    end
end

obj1 = HandleClass;
obj1.Property1 = 10;
obj2 = obj1; % Create a handle to obj1

obj2.Property1 = 20; % Modify obj2

% obj1 reflects the change
disp(obj1.Property1); % Output: 20
disp(obj2.Property1); % Output: 20

在 MATLAB 中使用 copyobj 复制对象

使用 copyobj 函数将对象从一个父对象复制到另一个父对象。新副本将在几个方面与原件不同:

  • Parent 属性将设置为新的父对象。
  • 复制对象的句柄将与原件不同。
  • copyobj 不会复制原始对象的回调属性。
  • 与原始对象关联的任何应用程序数据都不会被复制。

因此,使用 == 和 isequal 比较原始句柄和新句柄将返回 false。

您可以将各种对象复制到新的父对象,或者将一个对象复制到多个新的父对象,前提是正确维护了父子关系。复制具有子对象的对象时,MATLAB 也会复制所有子对象。

语法

new_handle = copyobj(h,p)

copyobj 复制图形对象并将它们分配给新的父对象。新的父对象必须适合于被复制的对象类型(例如,您只能将坐标轴复制到图形或面板)。该函数还复制父对象的所有子对象。

语法说明

new_handle = copyobj(h, p) 复制由 h 指定的一个或多个图形对象,并将它们放在图形对象 p 下。new_handle 是新创建的对象的句柄,或者对于多个复制的对象,是句柄数组。

使用 copyobj 时,某些依赖于其原始上下文的属性和对象不会被复制。例如,图例和颜色条等元素会为复制的对象生成新的上下文菜单,新的图形将具有新的工具栏和菜单。

以下是 copyobj 不复制的内容:

  • 回调函数 - 除非使用旧方法(传统选项),否则事件触发函数不会转移。
  • 应用程序数据 - 除非使用传统选项,否则与对象关联的任何额外数据都不会转移。
  • 上下文菜单 - 图例、颜色条和类似对象的默认上下文菜单不会被复制。
  • 工具栏和菜单 - 图形的默认工具栏和菜单选项将被重新创建,而不是复制。
  • 特殊坐标轴 - 与 yyaxis 函数一起使用的坐标轴不会被复制。
  • 坐标轴交互 - 与坐标轴关联的交互,例如缩放和平移,不会被复制。
  • DataTipTemplate - 线、散点图和曲面等对象上的自定义数据提示设置不会被转移。

此外,您不能在一次 copyobj 调用中将同一个对象多次复制到同一个父对象。

MATLAB 会自动将 Parent 属性更新为新的父对象,并将新的句柄分配给复制的对象。

使用 copyobj 的示例

我们拥有的代码是:

% Create a figure with some graphical objects
fig1 = figure('Name', 'Original Figure');
ax1 = axes('Parent', fig1);
plot(ax1, rand(10,1));

% Copy the figure to a new parent (another figure)
fig2 = figure('Name', 'Copied Figure');
newAx = copyobj(ax1, fig2);

% Update properties or callbacks as needed
set(newAx, 'Color', 'yellow');

在此示例中:

  • 创建了一个带有坐标轴和绘图的图形 (fig1)。
  • 使用 copyobj 将坐标轴 (ax1) 复制到新的图形 (fig2)。
  • 修改复制的坐标轴 (newAx)(例如,更改背景颜色),而原始图形和坐标轴保持不变。

在 matlab 命令窗口中执行代码后,我们将获得以下输出:

广告