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 =
10dsub = d(7:end); size(dsub)
ans =
1 4double класс задает эти поведения, включая индексацию круглых скобок.
Если подкласс явным образом не заменяет поведение суперкласса, подклассы ведут себя как свои суперклассы. Например, 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 10numel функция возвращает число элементов в части суперкласса:
numel(sd)
ans =
10Массивы объектов возвращают размер массивов суперкласса:
size([sd;sd])
ans =
2 10numel([sd;sd])
ans =
20SimpleDouble класс наследовал поведение индексации 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 4vs.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 objectArray.
Индексирующие правила для массивов объектов эквивалентны правилам для массивов 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 ведите себя, гарантируйте, что возвращенные значения целесообразны для надлежащего использования вашего класса.
Если классы реализуют a numArgumentsFromSubscript метод, MATLAB вызывает его вместо numel определить число элементов, возвращенное индексируемыми выражениями, которые возвращают списки, разделенные запятыми. Например, выражения, такие как:
A(1:2).Prop
Оба subsref и subsasgn используйте numArgumentsFromSubscript:
Подклассы встроенных классов всегда возвращают скалярные объекты в результате преобразованной в нижний индекс ссылки и всегда используют скалярные объекты для преобразованного в нижний индекс присвоения.
Если вы задаете класс в который nargout для subsref или nargin для subsasgn должно быть определенное значение, затем перегрузка numArgumentsFromSubscript возвращать то значение.