How to use object arrays in MEX
Mostrar comentarios más antiguos
Hello everybody!!
I would appreciate any help on my questions below.
I have simple user-defined class, which is actually a wrapper around MEX library. To support vectorized operations with objects of the class effectively I need to work with arrays of objects on C/C++ level in MEX. In relation with this I have several questions:
1. How can I create array of objects of the class inside MEX library?
2. How can I access each individual object of array of objects supplied by user to MEX-function.
I stuck on these issues and I would be grateful for any advice.
Class is NOT handle based, it looks like (bare minimum):
classdef abc
properties (SetAccess = public)
a
end % properties
function obj = abc(x)
if nargin == 0
obj.a = 0;
elseif nargin == 1
obj.a = x;
end
end % constructor
end % classdef
Respuesta aceptada
Más respuestas (1)
Pavel Holoborodko
el 5 de Abr. de 2011
0 votos
8 comentarios
James Tursa
el 5 de Abr. de 2011
The cat's out of the bag for the new OOP stuff ... I just hope they keep supporting the old method as well. And if you think mxGetPropertyPtr was a hack, wait 'till you see what I had to do to get an mxPutPropertyPtr routine! Prototype seems to work OK, still in testing. Maybe ready to post in a week or two.
Pavel Holoborodko
el 7 de Abr. de 2011
James Tursa
el 7 de Abr. de 2011
I.
Could you send me some details on passing the large property? I don't know what you mean by "converting objects to mxArray structure". All variables in MATLAB *are* mxArrays. There is nothing to convert as I understand it, and references to the original (or in some cases shared data copy to the original) are always passed to the mex routine in the prhs[]. And unless something has changed, the doc clearly implies that mxGetProperty returns a deep copy. Also, the test routines in my mxGetPropertyPtr FEX submission clearly show the deep copy behavior.
II & III.
Good info. I didn't know about the mxGetPropertyShared and mxSetPropertyShared. I will have to look into it and compare them to my version of mxSetPropertyPtr (which also sets a shared data copy). As for using these and other undocumented functions in mex code, I do it because I need to have efficient functions available to work in mex routines and TMW doesn't supply everything needed in the official API, particularly for the new classdef classes. To me this means my code may not work in future versions of MATLAB, but I am willing to accept that risk in exchange for the efficiency now. If it breaks in the future then I will tackle that problem then. (In fact, it might even be broken right now and I just don't know it because I haven't thrown the right test case at it to show it)
James Tursa
el 8 de Abr. de 2011
Just a quick glance only showed C++ mangled names for mxGetPropertyShared etc on my WinXP 32-bit. Are you using C++? What system/compiler?
James Tursa
el 9 de Abr. de 2011
Follow-up: I tested mxGetPropertyShared and it does indeed behave as expected, returning a shared data copy of the original property. Had to do it in C++ since there is no undecorated name in the lib for C to link with. Haven't had a chance to look at any of the others yet.
Pavel Holoborodko
el 11 de Abr. de 2011
Pavel Holoborodko
el 11 de Abr. de 2011
Pavel Holoborodko
el 12 de Abr. de 2011
Categorías
Más información sobre Write C Functions Callable from MATLAB (MEX Files) en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!