Функция 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 =
10dsub = 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 10numel([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 1numel(vs)
ans =
1size([vs;vs])
ans =
2 1numel([vs;vs])
ans =
2vs является скалярным объектом. Свойство 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 =
1MATLAB не применяет скалярное расширение на присвоение значения свойства объектного массива. Используйте функцию 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 10vsArray(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, чтобы возвратить то значение.