The size
function returns the dimensions of an array. The numel
function returns the number of elements in an array, which is equivalent to prod(size(objArray))
. That is, the product of the array dimensions.
The size
and numel
functions work consistently with arrays of user-defined objects. There is generally no need to overload size
or numel
in user-defined classes.
Several MATLAB® functions use size
and numel
to perform their operations. Therefore, if you do overload either of these functions in your class, be sure that objects of your class work as designed with other MATLAB functions.
If your class modifies array indexing, see Overload numArgumentsFromSubscript Instead of numel
When you use the size
and numel
functions in classes derived from built-in classes, these functions behave the same as they behave in the superclass.
Consider the built-in class double
:
d = 1:10; size(d)
ans = 1 10
numel(d)
ans = 10
dsub = d(7:end); size(dsub)
ans = 1 4
The double
class defines these behaviors, including parentheses indexing.
Unless the subclass explicitly overrides superclass behavior, subclasses behave like their superclasses. For example, SimpleDouble
subclasses double
and defines no properties:
classdef SimpleDouble < double methods function obj = SimpleDouble(data) if nargin == 0 data = 0; end obj = obj@double(data); end end end
Create an object and assign the values 1:10
:
sd = SimpleDouble(1:10);
The size
function returns the size of the superclass part:
size(sd)
ans = 1 10
The numel
function returns the number of elements in the superclass part:
numel(sd)
ans = 10
Object arrays return the size of the superclass arrays:
size([sd;sd])
ans = 2 10
numel([sd;sd])
ans = 20
The SimpleDouble
class inherits the indexing behavior of the double
class:
sdsub = sd(7:end); size(sdsub)
ans = 1 4
Consider a simple value class. This class does not inherit the array-like behaviors of the double
class. For example:
classdef VerySimpleClass properties Value end end
Create an object and assign a 10-element array to the Value
property:
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
is a scalar object. The Value
property is an array of doubles
:
size(vs.Value)
ans = 1 10
Apply indexing expressions to the object property:
vssub = vs.Value(7:end); size(vssub)
ans = 1 4
The vs.Value
property is an array of class double
:
class(vs.Value)
ans = double
Create an array of VerySimpleClass
objects:
vsArray(1:10) = VerySimpleClass;
The Value
property for array elements 2 through 10 is empty:
isempty([vsArray(2:10).Value])
ans = 1
MATLAB does not apply scalar expansion to object array property value assignment. Use the deal
function for this purpose:
[vsArray.Value] = deal(1:10); isempty([vsArray.Value])
ans = 0
The deal function assigns values to each Value
property in the vsArray
object array.
Indexing rules for object arrays are equivalent to the rules for arrays of struct
:
vsArray(1).Value
ans = 1 2 3 4 5 6 7 8 9 10
vsArray(1).Value(6)
ans = 6
Subclasses of built-in numeric classes inherit a size
method, which operates on the superclass part of the subclass object (these methods are hidden). If you want size
or numel
to behave differently, override them by defining a size
or numel
method in your subclass.
Other MATLAB functions use the values returned by these functions. If you change the way that size
and numel
behave, ensure that the values returned make sense for the intended use of your class.
If classes implement a numArgumentsFromSubscript
method, MATLAB calls it instead of numel
to determine the number of elements returned by indexed expressions that return comma-separated lists. For example, expressions such as:
A(1:2).Prop
Both subsref
and subsasgn
use numArgumentsFromSubscript
:
Subclasses of built-in classes always return scalar objects as a result of subscripted reference and always use scalar objects for subscripted assignment.
If you define a class in which nargout
for subsref
or nargin
for subsasgn
must be a specific value, then overload numArgumentsFromSubscript
to return that value.