numArgumentsFromSubscript

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

Описание

пример

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

Перегрузка numArgumentsFromSubscript для описания количества значений, возвращаемых из выражений индексации, которые возвращаются или присваиваются разделенному списками , разделенными запятыми. То есть индексация выражений, которые заканчиваются на '{}' или '.' индексация. The 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, операторы индексации ключевых слов запрашивают слишком много аргументов для 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

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

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

The 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