Search All of the Math Forum:
Views expressed in these public forums are not endorsed by
Drexel University or The Math Forum.



Re: MATLAB Concatenation Rules for objects
Posted:
May 9, 2013 4:22 AM


<kzelechowski@e3tech.local> wrote in message <518a04eb$0$1266$65785112@news.neostrada.pl>... > class (handle (0)) == 'root'; > class (libpointer) == 'lib.pointer'; > class ([ libpointer, (handle (0)) ]) == 'handle'; > % Why? The documentation says: MATLAB does not convert objects to a common > superclass unless those objects derive from a member of a heterogeneous > hierarchy. > % This is not the case: > isa (libpointer, 'math.mixin.Heterogeneous') == 0; > % So what is going on here? Moreover: > numel (superclasses (libpointer)) == 0; > numel (superclasses (handle (0))) == 0; > % So if they were heterogeneous, the superclass would be hidden. I am not > sure how to test for that.
handle() basically wraps its input in a UDD handle object. From Donn Shull's explanation (http://undocumentedmatlab.com/blog/introductiontoudd/#Tools):
handle is a multifaceted and unique term for The MathWorks. There are both UDD and MCOS handle classes. There is a UDD handle package. In terms of the tools we need, handle() is also an undocumented function which converts a numeric handle into a UDD handle object. Depending on your background you may want to think of handle as a cast operator which casts a numeric handle into a UDD object.
By using handle(), you can thus concatenate objects of different types. This can be very useful, as you have seen.
Matlab always shows the array as having the common type. If the concatenated objects are all alike, then their specific common type is displayed; otherwise, the common type is simply the base UDD handle class, which is basically the superclass you were looking for.
The mechanism you're using may be undocumented, but has worked consistently for the past decade or so, and I suspect (although I can't be certain) it will continue to work in the near future.
Note that a fully documented alternative is to use a cellarray, or a struct:
userdata = {0, libpointer};
userdata.numeric = 0; % root userdata.pointer = libpointer;
Yair Altman http://UndocumentedMatlab.com



