Use of size and numel with Classes
size and numel
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
Built-In Class Behavior
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 =
10dsub = d(7:end); size(dsub)
ans =
1 4The double class defines these behaviors, including parentheses
indexing.
Subclasses Inherit Behavior
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 10The numel function returns the number of elements in the
superclass part:
numel(sd)
ans =
10Object arrays return the size of the superclass arrays:
size([sd;sd])
ans =
2 10numel([sd;sd])
ans =
20The SimpleDouble class inherits the indexing behavior of the
double class:
sdsub = sd(7:end); size(sdsub)
ans =
1 4Classes Not Derived from Built-In Classes
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 1numel(vs)
ans =
1size([vs;vs])
ans =
2 1numel([vs;vs])
ans =
2vs is a scalar object. The Value property is
an array of doubles:
size(vs.Value)
ans =
1 10Apply indexing expressions to the object property:
vssub = vs.Value(7:end); size(vssub)
ans =
1 4The 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 =
1MATLAB 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 =
0The 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 10vsArray(1).Value(6)
ans =
6Change the Behavior of size or numel
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.
Overload numArgumentsFromSubscript Instead of numel
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.