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

size и numel

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

The size и numel функции работают последовательно с массивами пользовательских объектов. Перегрузки вообще не нужно size или numel в пользовательских классах.

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

Если ваш класс изменяет индексацию массива, см. «Перегрузка numArgumentsFromSubscript Вместо числа»

Встроенное поведение классов

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

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

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

     1    10
numel(d)
ans =

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

     1     4

The 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);

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

size(sd)
ans =

     1    10

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

numel(sd)
ans =

     10

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

size([sd;sd])
ans =

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

     20

The 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 является скалярным объектом. The Value свойство является массивом doubles:

size(vs.Value)
ans =

     1    10

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

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

     1     4

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

class(vs.Value)
ans =

double

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

vsArray(1:10) = VerySimpleClass;

The 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

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

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

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

Перегрузка numArgumentsFromSubscript Вместо числа

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

A(1:2).Prop

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

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

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

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

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

См. также

Похожие темы