exponenta event banner

numArgumentsFromSubscript

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

Описание

пример

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 метод с помощью varargout output, чтобы разрешить 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 сохраняет соответствующие данные. Чтобы настроить индексирование, выполните следующие действия.

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