Функция 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
.
Индексирующие правила для объектных массивов эквивалентны правилам для массивов 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
, MATLAB вызывает его вместо numel
, чтобы определить число элементов, возвращенное индексируемыми выражениями, которые возвращают списки, разделенные запятыми. Например, выражения, такие как:
A(1:2).Prop
И subsref
и subsasgn
используют numArgumentsFromSubscript
:
Подклассы встроенных классов всегда возвращают скалярные объекты в результате преобразованной в нижний индекс ссылки и всегда используют скалярные объекты для преобразованного в нижний индекс присвоения.
Если вы задаете класс, в котором nargout
для subsref
или nargin
для subsasgn
должны быть определенным значением, то перегрузка numArgumentsFromSubscript
, чтобы возвратить то значение.