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