Вызовы 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