Количество аргументов для subsref и subsasgn

Как MATLAB определяет количество аргументов

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 и subsasgn методов

Если класс перегружается subsref для поддержки любой из '{}', '.', или оба типа индексации, и операция возвращает более одного значения, перегрузка subsref чтобы вернуть несколько значений с помощью varargout:

function varargout = subsref(A,S)
   ...
end

Если класс перегружается subsasgn для поддержки любой из '{}', '.', или оба типа индексации, и операция присваивает более одного значения, перегрузка subsasgn для принятия нескольких значений с помощью varargin:

function A = subsasgn(A,S,varargin)
   ...
end

Похожие темы