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