Copying Objects - MATLAB & Simulink (original) (raw)
Two Copy Behaviors
There are two fundamental kinds of MATLAB® objects — handles and values.
Value objects behave like MATLAB fundamental types with respect to copy operations. Copies are independent values. Operations that you perform on one object do not affect copies of that object.
Handle objects are referenced by their handle variable. Copies of the handle variable refer to the same object. Operations that you perform on a handle object are visible from all handle variables that reference that object.
Handle Object Copy
If you are defining classes and want to support handle object copy, see Implement Copy for Handle Classes.
Value Object Copy Behavior
MATLAB numeric variables are value objects. For example, when you copy a
to the variable b
, both variables are independent of each other. Changing the value of a
does not change the value of b
:
Now reassign a
. b
is unchanged:
Clearing a
does not affect b
:
Value Object Properties
The copy behavior of values stored as properties in value objects is the same as numeric variables. For example, suppose vobj1
is a value object with property a
:
If you copy vobj1
to vobj2
, and then change the value of vobj1
property a
, the value of the copied object's property, vobj2.a
, is unaffected:
vobj2 =vobj1; vobj1.a = 5; vobj2.a
Handle Object Copy Behavior
Here is a handle class called HdClass
that defines a property called Data
.
classdef HdClass < handle properties Data end methods function obj = HdClass(val) if nargin > 0 obj.Data = val; end end end end
Create an object of this class:
Because this statement is not terminated with a semicolon, MATLAB displays information about the object:
hobj1 =
HdClass with properties:
Data: 8
The variable hobj1
is a handle that references the object created. Copying hobj1
to hobj2
results in another handle referring to the same object:
hobj2 =
HdClass with properties:
Data: 8
Because handles reference the object, copying a handle copies the handle to a new variable name, but the handle still refers to the same object. For example, given that hobj1
is a handle object with property Data
:
Change the value of hobj1
's Data
property and the value of the copied object's Data
property also changes:
hobj1.Data = 5; hobj2.Data
Because hobj2
and hobj1
are handles to the same object, changing the copy, hobj2
, also changes the data you access through handle hobj1
:
hobj2.Data = 17; hobj1.Data
Reassigning Handle Variables
Reassigning a handle variable produces the same result as reassigning any MATLAB variable. When you create an object and assign it to hobj1
:
hobj1
references the new object, not the same object referenced previously (and still referenced by hobj2
).
Clearing Handle Variables
When you clear a handle from the workspace, MATLAB removes the variable, but does not remove the object referenced by the other handle. However, if there are no references to an object, MATLAB destroys the object.
Given hobj1
and hobj2
, which both reference the same object, you can clear either handle without affecting the object:
hobj1.Data = 2^8; clear hobj1 hobj2
hobj2 =
HdClass with properties:
Data: 256
If you clear both hobj1
and hobj2
, then there are no references to the object. MATLAB destroys the object and frees the memory used by that object.
Deleting Handle Objects
To remove an object referenced by any number of handles, use delete. Given hobj1
and hobj2
, which both refer to the same object, delete either handle. MATLAB deletes the object:
hobj1 = HdClass(8); hobj2 = hobj1; delete(hobj1) hobj2
hobj2 =
handle to deleted HdClass
Use clear
to remove the variable from the workspace.
Modifying Objects
When you pass an object to a function, MATLAB passes a copy of the object into the function workspace. If the function modifies the object, MATLAB modifies only the copy of the object that is in the function workspace. The differences in copy behavior between handle and value classes are important in such cases:
- Value object — The function must return the modified copy of the object. To modify the object in the caller’s workspace, assign the function output to a variable of the same name
- Handle object — The copy in the function workspace refers to the same object. Therefore, the function does not have to return the modified copy.
Testing for Handle or Value Class
To determine if an object is a handle object, use the isa function. If obj
is an object of some class, this statement determines if obj
is a handle:
For example, the containers.Map
class creates a handle object:
hobj = containers.Map({'Red Sox','Yankees'},{'Boston','New York'}); isa(hobj,'handle')
hobj
is also a containers.Map
object:
isa(hobj,'containers.Map')
Querying the class of hobj
shows that it is a containers.Map
object:
The class function returns the specific class of an object.