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 = subsagn(A,S,varargin) ... end