Использование размера и 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

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

A(1:2).Prop

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

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

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

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

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

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

Похожие темы