exponenta event banner

Использование размера и числа с классами

размер и числовое значение

size функция возвращает размеры массива. numel функция возвращает количество элементов в массиве, которое эквивалентно prod(size(objArray)). То есть произведение размеров массива.

size и numel функции работают последовательно с массивами определяемых пользователем объектов. Как правило, нет необходимости в перегрузке size или numel в определяемых пользователем классах.

Используется несколько функций MATLAB ® size и numel для выполнения своих операций. Поэтому при перегрузке любой из этих функций в классе убедитесь, что объекты класса работают в соответствии с другими функциями MATLAB.

Если класс изменяет индексирование массива, см. раздел «» Перегрузка numIncomPendingStartSubscript Вместо numel

Поведение встроенных классов

При использовании size и numel функции в классах, полученных из встроенных классов, ведут себя так же, как и в суперклассе.

Рассмотрим встроенный класс double:

d = 1:10;
size(d)
ans =

     1    10
numel(d)
ans =

    10
dsub = d(7:end);
size(dsub)
ans =

     1     4

double класс определяет эти варианты поведения, включая индексирование в круглых скобках.

Поведение наследования подклассов

Если подкласс явно не переопределяет поведение суперкласса, подклассы ведут себя как суперклассы. Например, SimpleDouble подклассы double и не определяет свойств:

classdef SimpleDouble < double
   methods
      function obj = SimpleDouble(data)
         if nargin == 0
            data = 0;
         end
         obj = obj@double(data);
      end
   end
end

Создание объекта и присвоение значений 1:10:

sd = SimpleDouble(1:10);

size функция возвращает размер части суперкласса:

size(sd)
ans =

     1    10

numel функция возвращает число элементов в суперклассной части:

numel(sd)
ans =

     10

Массивы объектов возвращают размер массивов суперкласса:

size([sd;sd])
ans =

     2    10
numel([sd;sd])
ans =

     20

SimpleDouble класс наследует поведение индексации double класс:

sdsub = sd(7:end);
size(sdsub)
ans =

     1     4

Классы, не производные от встроенных классов

Рассмотрим простой класс значений. Этот класс не наследует поведение массива double класс. Например:

classdef VerySimpleClass
   properties
      Value
   end
end

Создайте объект и назначьте 10-элементный массив Value свойство:

vs = VerySimpleClass;
vs.Value = 1:10;
size(vs)
ans =

     1     1
numel(vs)
ans =

     1
size([vs;vs])
ans =

     2     1
numel([vs;vs])
ans =

     2

vs является скалярным объектом. Value свойство является массивом doubles:

size(vs.Value)
ans =

     1    10

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

vssub = vs.Value(7:end);
size(vssub)
ans =

     1     4

vs.Value свойство является массивом класса double:

class(vs.Value)
ans =

double

Создание массива VerySimpleClass объекты:

vsArray(1:10) = VerySimpleClass;

Value свойство для элементов массива 2-10 пусто:

isempty([vsArray(2:10).Value])
ans =

     1

MATLAB не применяет скалярное расширение к назначению значений свойств массива объектов. Используйте deal функция для этой цели:

[vsArray.Value] = deal(1:10);
isempty([vsArray.Value])
ans =

     0

Функция сделки присваивает значения каждому Value свойство в vsArray массив объектов.

Правила индексирования для массивов объектов эквивалентны правилам для массивов struct:

vsArray(1).Value
ans =

     1     2     3     4     5     6     7     8     9    10
vsArray(1).Value(6)
ans =

     6

Изменение поведения размера или числа

Подклассы встроенных числовых классов наследуют a size метод, который работает с надклассовой частью объекта подкласса (эти методы скрыты). Если хотите size или numel чтобы вести себя иначе, переопределите их, определив size или numel метод в подклассе.

Другие функции MATLAB используют значения, возвращаемые этими функциями. Если изменить способ, size и numel поведите себя, убедитесь, что возвращенные значения имеют смысл для предполагаемого использования вашего класса.

Перегрузить значение numPEydFulcript Вместо числа

Если классы реализуют numArgumentsFromSubscript метод MATLAB вызывает его вместо numel для определения количества элементов, возвращаемых индексированными выражениями, которые возвращают списки, разделенные запятыми. Например, выражения, такие как:

A(1:2).Prop

Оба subsref и subsasgn использовать numArgumentsFromSubscript:

  • subsrefnumArgumentsFromSubscript вычисляет количество ожидаемых выходов (nargout) возвращено subsref.

  • subsasgnnumArgumentsFromSubscript вычисляет количество ожидаемых входов (nargin), которое MATLAB назначает в результате вызова subsasgn.

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

При определении класса, в котором nargout для subsref или nargin для subsasgn должно быть определенным значением, а затем перегрузка numArgumentsFromSubscript чтобы вернуть это значение.

См. также

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