Использование размера и numel с Классами

размер и numel

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

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

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

Если ваш класс изменяет индексацию массива, смотрите Перегрузку numArgumentsFromSubscript Вместо 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 objectArray.

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

vsArray(1).Value
ans =

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

     6

Изменение Поведения размера или numel

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

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

Перегрузка numArgumentsFromSubscript Вместо numel

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

A(1:2).Prop

Оба subsref и subsasgn используйте numArgumentsFromSubscript:

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

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

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

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

Смотрите также

Похожие темы