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