How to overload a single parentheses indexing operation, not all of them?
11 views (last 30 days)
Show older comments
Beginning in MATLAB R2021b it is possible to overload parentheses, dot, and brace indexing independently. This gives the ability to overload paren-indexing while preserving the default behavior and performance of dot-indexing for the class.
But if I try to implement a single operation I get the message
Abstract classes cannot be instantiated. Class 'Vec' inherits abstract methods or properties but does
not implement them. See the list of methods and properties that 'Vec' must implement if you do not
intend the class to be abstract.
Abstract methods for class Vec:
parenListLength % defined in matlab.mixin.indexing.RedefinesParen
parenDelete % defined in matlab.mixin.indexing.RedefinesParen
parenAssign % defined in matlab.mixin.indexing.RedefinesParen
parenReference % defined in matlab.mixin.indexing.RedefinesParen
empty % defined in matlab.mixin.indexing.RedefinesParen
cat % defined in matlab.mixin.indexing.RedefinesParen
size % defined in matlab.mixin.indexing.RedefinesParen
It seems overloading all of them is rather hairy and involved. Is there a way to provide just a single method that I need?
2 Comments
Walter Roberson
on 31 Dec 2021
What kind of change of behaviour could you be wanting to implement, that does not also affect things like size() or cat() behaviour ? Are you, for example, just adding statistics counting the number of negative values accessed? But only for one of the access methods ??
Answers (2)
Matt J
on 31 Dec 2021
Edited: Matt J
on 31 Dec 2021
Here is a way to do it by overloading subsref. You might have to do the analogous implementation of subsasgn, if assignments are needed.
methods
function varargout=subsref(objs,subs)
switch subs(1).type
case '()'
value=reshape([objs.value],size(objs));
varargout={builtin('subsref',value,subs)};
otherwise
[varargout{1:nargout}]=builtin('subsref',objs,subs);
end
end
0 Comments
James Lebak
on 3 Jan 2022
Edited: James Lebak
on 3 Jan 2022
I would not do this by overloading indexing. As you point out, overloading indexing is difficult, and as Walter points out you should only overload indexing if you are really fundamentally changing the behavior of the object. It sounds to me like you want the objects to act like a default MATLAB object array but you want a convenient way to concatenate the properties.
You may be able to accomplish most of what you want by writing a method on your object that concatenates the values of the property into an array. For example,
function out = getValuesAsArray(obj)
out = [obj.values];
end
Then you could invoke the method on a subset of your array like so:
x = obj.getValuesAsArray(); % Concatenates all the values from the array
x = obj(1:10,:).getValuesAsArray() % Concatenates the values from the first 10 rows of every column
0 Comments
See Also
Categories
Find more on Matrix Indexing in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!