operator overloading: class*number vs number*class

2 views (last 30 days)
Hello,
I've defined a class (lets say vector) and I want to be able to overload the following binary operations
1) >> my_class*number
2) >> number*my_class
I have overloaded mtimes, and then case 1) works (I detect the type of the second operator and proceed accordingly), but case 2) does not. In fact the mtimes function of the class does not get called in case 2).
This may seem as logical, but in cannot figure out a work arround for 2).
How do I program behavior for case 2), that is number*my_class ?.
Thanks,
Javier

Accepted Answer

Javier Ros
Javier Ros on 29 Aug 2018
Solution:
It seems that it is a question of object precedence when invoking the mtimes defined operator.
Changing the definition of my_Class from
classdef my_Class
to
classdef (InferiorClasses = {?sym}) my_Class
gives precedence to my_Class mtimes method against the one of sym class

More Answers (1)

Javier Ros
Javier Ros on 29 Aug 2018
Edited: Javier Ros on 29 Aug 2018
After some more trials I presume this is a BUG related to the symbolic toolbox.
If I do
2.1) >> 5*my_class ---->>>> WORKS it enters the overloaded class function mtimes
2.2) >> syms g real, g*my_class --->>>> FAILS it does not enter the class function mtimes
The error is:
>> g*ez %g is syms g real, and ez is of type my_class
Error using sym>tomupad (line 1229)
Unable to convert 'my_class' to 'sym'.
Error in sym (line 211)
S.s = tomupad(x);
Error in sym/privResolveArgs (line 966)
argout{k} = sym(arg);
Error in sym/privBinaryOp (line 990)
args = privResolveArgs(A, B);
Error in * (line 312)
X = privBinaryOp(A, B, 'symobj::mtimes');
  1 Comment
Steven Lord
Steven Lord on 29 Aug 2018
No, this is not a bug.
I assume you posted this answer before posting the one that you ultimately accepted, as in the accepted answer you successfully identified how to obtain the behavior you wanted. The comment I posted to that accepted answer points to the documentation page that explains why you see this behavior.

Sign in to comment.

Products


Release

R2018a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!