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