numArgumentsFromSubscript

Количество аргументов для индивидуально настраиваемых методов индексирования

Синтаксис

n = numArgumentsFromSubscript(obj,s,indexingContext)

Описание

пример

n = numArgumentsFromSubscript(obj,s,indexingContext) возвращает количество ожидаемых входных параметров к subsasgn или количество ожидаемых выходных параметров от subsref.

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

  • Доступ к операциям индексации и индексам используется в выражении индексации.

  • Определите, сделана ли операция индексации в контексте ссылочного оператора, выражение передало функции или присвоению.

Если класс перегружает numArgumentsFromSubscript, MATLAB® вызывает его, чтобы определить количество элементов массива, вовлеченных в операцию индексации, когда число элементов больше, чем одно. Например, эти операции индексации '.' генерируют вызов numArgumentsFromSubscript:

  • objArray.a — Число элементов сослалось в операторе (Statement)

  • func(objArray.a) — Число элементов возвращено в выражении (Expression)

  • [objArray.a] = rhs — Номер значений присвоен со списком, разделенным запятыми (Assignment)

MATLAB использует контекст вызова, чтобы определить, когда применить значение, возвращенное numArgumentsFromSubscript. Ваша реализация numArgumentsFromSubscript может обеспечить различные выходные параметры для трех типов индексации операторов. Например, эта перегрузка numArgumentsFromSubscript:

  • Изменяет ожидаемое количество выходных аргументов от subsref для индексации выражений, которые передаются функциям.

  • Использует подструктуру индексации s, чтобы определить количество аргументов, требуемых операцией индексации

function n = numArgumentsFromSubscript(obj,s,indexingContext)
   if indexingContext == matlab.mixin.util.IndexingContext.Expression
      n = 1;
   else
      n = length(s(1).subs{:});
   end
end

Реализуйте метод subsref с varargout вывод, чтобы позволить MATLAB вызвать этот метод с конкретным количеством выходных аргументов.

function varargout = subsref(obj,s)
   ...
end

Примеры

свернуть все

Используйте слова в качестве индексов для свойств объектов.

По умолчанию MATLAB обрабатывает каждый символ в символьном массиве как отдельный элемент. Поэтому MATLAB интерпретирует индекс символьного массива как несколько индексных значений.

Не перегружая numArgumentsFromSubscript, операторы индексации ключевого слова запрашивают слишком много аргументов на методы subsasgn и subsref. Чтобы реализовать индексацию, которая использует символьные массивы в качестве единственного ключевого слова, задайте метод numArgumentsFromSubscript, чтобы возвратить 1 как число элементов, на которое ссылаются или присвоенный.

Перегрузка numArgumentsFromSubscript, чтобы поддержать следующие виды индексируемой ссылки и присвоения.

Ссылка на указатель с символьным массивом:

obj{'keyword'}

Ссылка на указатель в аргументе функции:

func(obj{'keyword'})

Присвойте список, разделенный запятыми объектному массиву:

[obj{'keyword'}] = right-side values;

В этих случаях subsref и subsasgn не могут определить количество необходимых выходных аргументов и входных параметров, соответственно, от контекста вызова. Предоставьте эту информацию с помощью функции numArgumentsFromSubscript.

Задайте класс KeyIndex с двумя свойствами. KeyCell хранит ключевые имена. DataArray хранит соответствующие данные. Настроить индексацию:

  • Реализуйте метод subsref, который возвращает значения данных, которые соответствуют заданному ключевому слову.

  • Реализуйте метод subsasgn, который присваивает заданные значения соответствующему элементу в свойствах DataArray.

  • Перегрузка numArgumentsFromSubscript, чтобы возвратить значение 1 или скаляра возражает и значение numel(objArray) для объектных массивов.

Задайте массив ячеек, содержащий имена месяцев для свойства KeyCell. Задайте числовой массив падения снега за соответствующие месяцы в свойстве DataArray.

snow15 = KeyIndex({'Jan','Feb','March'},[36 42 2])
snow15 = 

  KeyIndex with properties:

      KeyCell: {'Jan'  'Feb'  'March'}
    DataArray: [36 42 2]

Сошлитесь на количество снега в течение конкретного месяца с помощью ключевого слова:

snow15{'Feb'}
ans =

    42

Присвойте соответствующему элементу, использующему индексацию '{}' с ключевым словом:

snow15{'Feb'} = 52;

Значение, соответствующее изменениям ключа 'Feb':

snow15{'Feb'}
ans =

    52

Создайте массив с падением снега за 2 года:

snow14 = KeyIndex({'Jan','Feb','March'},[12 8 2]);
sTotal = [snow14,snow15];

Покажите падение снега за оба года на февраль:

sTotal{'Feb'}
ans =

     8


ans =

    52

Обновите значения падения снега за оба года в течение месяца февраля. Индексация в массив ячеек возвращает список, разделенный запятыми:

c{1} = 34;
c{2} = 56;
[sTotal{'Feb'}] = c{:};

Вот класс KeyIndex. Этот класс показывает конкретный метод программирования. Это не включает проверку ошибок и другие функции, которых может потребовать ваш класс.

classdef KeyIndex
   properties
      KeyCell
      DataArray
   end
   methods
      function obj = KeyIndex(key,data)
         if nargin > 0
            obj.KeyCell = key;
            obj.DataArray = data;
         end
      end
      function n = numArgumentsFromSubscript(obj,~,~)
         n = numel(obj);
      end
      function varargout = subsref(obj,s)
         a = numel(obj);
         switch s(1).type
            case '{}'
               varargout = cell(1,a);
               for j = 1:a
                  for k = 1:numel(obj(j).KeyCell)
                     if strcmp(s.subs(:),obj(j).KeyCell{k})
                        varargout{j} = obj(j).DataArray(k);
                     end
                  end
               end
            case '.'
               varargout = {builtin('subsref',obj,s)};
            case '()'
               varargout = {builtin('subsref',obj,s)};
         end
      end
      function obj = subsasgn(obj,s,varargin)
         a = numel(varargin);
         switch s(1).type
            case '{}'
               for j = 1:a
                  for k = 1:numel(obj(j).KeyCell)
                     if strcmp(s.subs(:),obj(j).KeyCell{k})
                        obj(j).DataArray(k) = varargin{j};
                     end
                  end
               end
            case '.'
               obj = builtin('subsasgn',obj,s,varargin{:});
            case '()'
               obj = builtin('subsasgn',obj,s,varargin{:});
         end
      end
   end
end

Задайте класс, который поддерживает на элемент и на индексацию массива для свойств.

Функция numArgumentsFromSubscript позволяет классам настроить ссылки на определенные свойства. Аргумент подструктуры индексации (s) к numArgumentsFromSubscript содержит имя свойства, на которое ссылаются в выражении индексации точки (то есть, ссылка формы obj.PropertyName PropertyName . Используя подструктуру индексации, numArgumentsFromSubscript может возвратить уникальное значение для любого данного свойства.

Класс PerArray использует информацию в подструктуре индексации, чтобы задать количество выходных параметров для каждой ссылки свойства.

Перегрузка numArgumentsFromSubscript, чтобы возвратиться:

  • Список, разделенный запятыми значений для свойства ByElement, одного значения на элемент массива

  • Единственное значение для свойства ByArray для целого массива

Создайте массив объектов PerArray:

for k = 1:4
   pa(k) = PerArray(rand(k));
end

Запросите свойство ByElement возвратить список, разделенный запятыми значений свойств:

pa.ByElement
ans =

    0.7513


ans =

    0.2551    0.6991
    0.5060    0.8909


ans =

    0.9593    0.1493    0.2543
    0.5472    0.2575    0.8143
    0.1386    0.8407    0.2435


ans =

    0.9293    0.6160    0.5853    0.7572
    0.3500    0.4733    0.5497    0.7537
    0.1966    0.3517    0.9172    0.3804
    0.2511    0.8308    0.2858    0.5678

Запросите свойство ByArray возвратить единственное значение для массива:

pa.ByArray
ans =

    3.1416

Вот класс PerArray. Этот класс показывает конкретный метод программирования. Это не включает проверку ошибок и другие функции, которых может потребовать ваш класс.

classdef PerArray
   properties
      ByElement
   end
   properties (Constant)
      ByArray = pi;
   end
   methods
      function obj = PerArray(be)
         if nargin > 0
            obj.ByElement = be;
         end
      end
      function n = numArgumentsFromSubscript(obj,s,indexingContext)
         import matlab.mixin.util.IndexingContext
         if (indexingContext ~= IndexingContext.Assignment)
            if length(s) < 2
               switch (s.subs(:)')
                  case 'ByElement'
                     n = numel(obj);
                  case 'ByArray'
                     if strcmp(s(1).type,'.')
                        n = 1;
                     end
               end
            elseif length(s) > 1
               n = length([s(1).subs{:}]);
            end
         end
      end
      function varargout = subsref(obj,s)
         
         switch s(1).type
            case '.'
               varargout = cell(1,numel(obj));
               for k = 1:numel(obj)
                  varargout{k} = obj(k).(s.subs(:));
               end
            case '()'
               if length([s(1).subs{:}]) > 1
                  ind = [s(1).subs{:}];
                  numInd = length(ind);
                  varargout = cell(1,numInd);
                  for k = 1:numInd
                     varargout{k} = obj(ind(k)).(s(2).subs(:));
                  end
               else
                  varargout = {builtin('subsref',obj,s)};
               end
         end
      end
   end
end

Входные параметры

свернуть все

Объект перегружающегося класса используется в операции индексации. Класс этого объекта определяет, который subsref или метод subsasgn MATLAB вызывает в результате операции индексации.

Индексация структуры или массива индексации структур, содержащих информацию об определенном выражении индексации. Каждая структура имеет два поля:

  • ввод Индексацией выражения может быть '()', '{}', '.'

  • subs — Нижние значения (имя свойства или массив ячеек индексов)

Типы данных: struct

Контекст, в котором результат применяется, заданный как одно из этих перечислений:

  • matlab.mixin.util. IndexingContext. Оператор — Индексируемая ссылка, используемая в качестве оператора (obj. a

  • matlab.mixin.util. IndexingContext. Выражение — Индексируемая ссылка, используемая в качестве аргумента к функции (func (obj. a

  • matlab.mixin.util. IndexingContext. Присвоение — Индексируемое присвоение ([obj.a] = x).

Выходные аргументы

свернуть все

Количество аргументов, возвращенных перегруженным subsref или, передало перегруженному subsasgn. Перегрузка numArgumentsFromSubscript, чтобы возвратить значения, требуемые вашим классом для различных сценариев индексации.

Советы

  • Перегрузка numArgumentsFromSubscript вместо numel, чтобы управлять результатами перегруженного subsref и subsasgn. Перегрузка numArgumentsFromSubscript может избежать ошибок, вызванных путем перегрузки numel.

Введенный в R2015b

Была ли эта тема полезной?