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 命令視窗中執行程式碼後,我們將獲得以下輸出:

廣告
© . All rights reserved.