numArgumentsFromSubscript

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

Описание

Эта функция поддержки настроила индексацию для классов та реализация subsref и subsasgn. Для классов, созданных в R2021b и позже, рекомендуемый процесс, чтобы настроить индексацию должен наследоваться некоторой комбинации matlab.mixin.indexing.RedefinesParen, matlab.mixin.indexing.RedefinesDot, и matlab.mixin.indexing.RedefinesBrace. Эквивалентная функция для вычисления количества аргументов для этого типа индексации listLength. Для получения дополнительной информации смотрите, Настраивают Индексирование объектов.

пример

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

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

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

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

Если класс перегрузки numArgumentsFromSubscriptMATLAB® вызовы это, чтобы определить количество элементов массива, вовлеченных в операцию индексации, когда число элементов больше того. Например, они '.' индексирующие операции генерируют вызов 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 метод с a varargout выведите, чтобы позволить MATLAB вызвать этот метод с конкретным количеством выходных аргументов.

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

Примеры

свернуть все

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

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

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

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

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

obj{'keyword'}

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

func(obj{'keyword'})

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

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

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

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

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

  • Реализуйте a 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). Используя подструктуру индексации, 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 вызывает в результате операции индексации.

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

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

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

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

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

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

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

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

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

свернуть все

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

Советы

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

Введенный в R2015b