MATLAB® вызовы subsref
или subsasgn
для определения результата выполнения кода, который включает индексированную ссылку или назначение. Количество элементов, на которые ссылается или назначается операция индексации, определяет количество аргументов, которые MATLAB использует для вызова subsref
и subsasgn
. То есть код индексации определяет количество аргументов, которые MATLAB:
Возвращается из вызова в subsref
Переходит к вызову на subsasgn
Поэтому код индексации определяет значение nargout
для вызова на subsref
и значение nargin
для вызова на subsasgn
.
Для примера рассмотрим ValuesArray
класс.
classdef ValuesArray properties Values end methods function obj = ValuesArray(v) if nargin > 0 obj.Values = v; end end end end
Создайте массив из 10 ValuesArray
объекты.
l = ValuesArray.empty; for k = 1:10 l(k) = ValuesArray(k); end
Эта подписанная ссылка возвращает разделенный списками , разделенными запятыми из трех элементов. Для этого оператора значение nargout
в subsref
является 3
.
l(1:3).Values
ans = 1 ans = 2 ans = 3
Левая сторона подписанного оператора назначения влияет на количество входных параметров, которые MATLAB использует для вызова subsasgn
. Это подписанное назначение присваивает три значения трем элементам, добавленным в массив. Для этого присвоения, значение nargin
в subsasgn
Значение 5 (объект, подструктура индексации и три значения, которые нужно назначить).
[l(11:13).Values] = l(1:3).Values
l = 1x13 ValuesArray array with properties: Values
Если количество аргументов правой стороны не может удовлетворить количеству аргументов левой стороны, MATLAB возвращает ошибку:
[l(11:13).Values] = l(1).Values
Insufficient number of outputs from right hand side of equal sign to satisfy assignment.
Если класс перегружается subsref
для поддержки любой из '{}'
, '.'
, или оба типа индексации, и операция возвращает более одного значения, перегрузка subsref
чтобы вернуть несколько значений с помощью varargout
:
function varargout = subsref(A,S) ... end
Если класс перегружается subsasgn
для поддержки любой из '{}'
, '.'
, или оба типа индексации, и операция присваивает более одного значения, перегрузка subsasgn
для принятия нескольких значений с помощью varargin
:
function A = subsasgn(A,S,varargin) ... end