MATLAB® calls subsref
or subsasgn
to determine the result of executing code that involves indexed
reference or assignment. The number of elements referenced or assigned by an indexing
operation determines the number of arguments MATLAB uses to call subsref
and
subsasgn
. That is, the indexing code determines the number of
arguments that MATLAB:
Returns from the call to subsref
Passes to the call to subsasgn
Therefore, the indexing code determines the value of nargout
for the call to subsref
and the value of
nargin
for the call to
subsasgn
.
For example, consider the ValuesArray
class.
classdef ValuesArray properties Values end methods function obj = ValuesArray(v) if nargin > 0 obj.Values = v; end end end end
Create an array of 10 ValuesArray
objects.
l = ValuesArray.empty; for k = 1:10 l(k) = ValuesArray(k); end
This subscripted reference returns a comma-separated list of three elements. For this
statement, the value of nargout
in subsref
is
3
.
l(1:3).Values
ans = 1 ans = 2 ans = 3
The left side of a subscripted assignment statement affects the number of input
arguments that MATLAB uses to call subsasgn
. This subscripted assignment
assigns three values to the three elements added to the array. For this assignment, the
value of nargin
within subsasgn
is 5 (the
object, the indexing substructure, and the three values to assign).
[l(11:13).Values] = l(1:3).Values
l = 1x13 ValuesArray array with properties: Values
If the number of right-side arguments cannot satisfy the number of left-side arguments, MATLAB returns an error:
[l(11:13).Values] = l(1).Values
Insufficient number of outputs from right hand side of equal sign to satisfy assignment.
If a class overloads subsref
to support either
'{}'
, '.'
, or both types of indexing, and the
operation returns more than one value, overload subsref
to return
multiple values using varargout
:
function varargout = subsref(A,S) ... end
If a class overloads subsasgn
to support either
'{}'
, '.'
, or both types of indexing, and the
operation assigns more than one value, overload subsasgn
to accept
multiple values using varargin
:
function A = subsagn(A,S,varargin) ... end