Object indexed assignments are in three forms — parentheses, braces, and dot-name:
A(I) = B A{I} = B A.name = B
Each of these statements results in a call by MATLAB® to the subsasgn
method of class
A
, or a call to the built-in subsasgn
function
if the class of A
does not implement a subsasgn
method.
MATLAB passes three arguments to subsasgn
and requires subsasgn
to return the result of the assignment:
A = subsasgn(A,S,B)
The first argument, A
, is the object being assigned the value in the third argument B
.
The second argument is the indexing structure, substruct
. S
has two fields:
S.type
is a char
vector containing '()'
, '{}'
, or '.'
specifying the indexing type used.
S.subs
is a cell array or character array containing the actual indices or field name. A colon used as an index is passed in the cell array as the character ':'
. Ranges specified using a colon (e.g., 2:5
) are expanded to 2 3 4 5
.
For example, the assignment statement:
A(2,3) = B;
generates a call to subsasgn
:
A = subsasgn(A,S,B)
S
contains:
S.type = '()'
S.subs = {2,3}
The built-in subsasgn
:
Determines the class of A
. If B
is not the same class as A
, then MATLAB tries to construct an object of the same class as A
using B
as an input argument. If this attempt fails, MATLAB returns an error.
If A
and B
are, or can be made, into the same class, then MATLAB assigns the value of B
to the array element at row 2
, column 3
.
If A
does not exist before you execute the assignment statement, then MATLAB initializes the five array elements that come before A(2,3)
with default objects of class B
.
Similarly, this expression
A{2,3} = B
Uses these values for S
:
S.type ='{}'
S.subs = {2,3}
The built-in subsasgn
:
Assigns B
to the cell
array element at row 2
, column 3
.
If A
does not exist before you execute the assignment statement, MATLAB initializes the five cells that come before A(2,3)
with []
. The result is a 2-by-3 cell array.
This expression:
A.Name = B
Calls A = subsasgn(A,S,B)
where the struct
S
has these values:
S.type = '.' S.subs = 'Name'
The built-in subsasgn
:
Assigns B
to the struct
field Name
.
If A
does not exist before you execute the assignment statement, MATLAB creates a struct
variable, A
with field Name
and assigns the value of B
to this field location.
If struct
A
exists, but has no field Name
, then MATLAB adds the field Name
and assigns the value of B
to the new field location.
If struct
A
exists and has a Name
field, then MATLAB assigns the value of B
to Name
.
You can redefine all or some of these assignment behaviors by implementing a subsasgn
method for your class.
If A
is an object, this expression:
A.Name = B
Calls A = subsasgn(A,S,B)
where, S
has these values:
S.type = '.' S.subs = 'Name'
The default subsasgn
:
Attempts to assign B
to the Name
property.
If the class of A
does not have a Name
property, MATLAB returns an error.
If the Name
property has restricted access (private
or protected
), MATLAB determines if the assignment is allowed based on the context in which the assignment is made.
If the class of A
defines a set method for property Name
, MATLAB calls the set method.
MATLAB applies all other property attributes before determining whether to assigning B
to the property Name
.
These simple calls are combined for more complicated indexing expressions. In such cases, length(S)
is the number of indexing levels. For example,
A(1,2).PropertyName(1:4) = B
calls subsasgn(A,S,B)
, where S
is a 3-by-1 array of structures with the values:
S(1).type = '()' S(2).type = '.' S(3).type = '()' S(1).subs = {1,2} S(2).subs = 'PropertyName' S(3).subs = {1:4}