size функция возвращает размерности массива. numel функция возвращает количество элементов в массиве, что эквивалентно prod(size(objArray)). То есть продукт измерений массива.
The size и numel функции работают последовательно с массивами пользовательских объектов. Перегрузки вообще не нужно size или numel в пользовательских классах.
Несколько MATLAB® использование функций size и numel для выполнения своих операций. Поэтому, если вы перегрузите любую из этих функций в своем классе, убедитесь, что объекты вашего класса работают как спроектированные с другими функциями MATLAB.
Если ваш класс изменяет индексацию массива, см. «Перегрузка numArgumentsFromSubscript Вместо числа»
Когда вы используете size и numel функции в классах, выведенных из встроенных классов, эти функции ведут себя так же, как и в суперклассе.
Рассмотрим встроенный класс double:
d = 1:10; size(d)
ans =
1 10
numel(d)
ans =
10dsub = d(7:end); size(dsub)
ans =
1 4The 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);
The size функция возвращает размер части суперкласса:
size(sd)
ans =
1 10The numel функция возвращает количество элементов в части суперкласса:
numel(sd)
ans =
10Объектные массивы возвращают размер массивов суперкласса:
size([sd;sd])
ans =
2 10numel([sd;sd])
ans =
20The 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 является скалярным объектом. The Value свойство является массивом doubles:
size(vs.Value)
ans =
1 10Применить выражения индексации к свойству объекта:
vssub = vs.Value(7:end); size(vssub)
ans =
1 4The vs.Value свойство является массивом классов double:
class(vs.Value)
ans = double
Создайте массив VerySimpleClass объекты:
vsArray(1:10) = VerySimpleClass;
The 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 чтобы вернуть это значение.