exponenta event banner

Число аргументов для подзаписи и подзадачи

Как 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 и subsasn

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

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

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

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

Связанные темы