size функция возвращает размеры массива. numel функция возвращает количество элементов в массиве, которое эквивалентно prod(size(objArray)). То есть произведение размеров массива.
size и numel функции работают последовательно с массивами определяемых пользователем объектов. Как правило, нет необходимости в перегрузке size или numel в определяемых пользователем классах.
Используется несколько функций MATLAB ® size и numel для выполнения своих операций. Поэтому при перегрузке любой из этих функций в классе убедитесь, что объекты класса работают в соответствии с другими функциями MATLAB.
Если класс изменяет индексирование массива, см. раздел «» Перегрузка numIncomPendingStartSubscript Вместо 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Подклассы встроенных числовых классов наследуют a size метод, который работает с надклассовой частью объекта подкласса (эти методы скрыты). Если хотите size или numel чтобы вести себя иначе, переопределите их, определив size или numel метод в подклассе.
Другие функции MATLAB используют значения, возвращаемые этими функциями. Если изменить способ, size и numel поведите себя, убедитесь, что возвращенные значения имеют смысл для предполагаемого использования вашего класса.
Если классы реализуют numArgumentsFromSubscript метод MATLAB вызывает его вместо numel для определения количества элементов, возвращаемых индексированными выражениями, которые возвращают списки, разделенные запятыми. Например, выражения, такие как:
A(1:2).Prop
Оба subsref и subsasgn использовать numArgumentsFromSubscript:
Подклассы встроенных классов всегда возвращают скалярные объекты в результате ссылки на подстрочный индекс и всегда используют скалярные объекты для назначения подстрочного индекса.
При определении класса, в котором nargout для subsref или nargin для subsasgn должно быть определенным значением, а затем перегрузка numArgumentsFromSubscript чтобы вернуть это значение.