How to use object arrays in MEX

2 vues (au cours des 30 derniers jours)
Pavel Holoborodko
Pavel Holoborodko le 4 Avr 2011
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

Réponse acceptée

James Tursa
James Tursa le 4 Avr 2011
You can do this with a helper m-file:
% CreateClassArray.m helper file for mxCreateClassArray mex function
function class_array = CreateClassArray(dims,classname)
estring = 'class_array(';
for k=1:numel(dims);
estring = [estring '1:' num2str(dims(k)) ','];
end
estring(end) = ')';
estring = [estring '=' classname ';'];
eval(estring);
end
And then you can use this function in your mex routine:
/* Create a class array with default class element entries */
mxArray *mxCreateClassArray(mwSize ndim, const mwSize *dims, const char *classname)
{
mxArray *rhs[2];
mxArray *mx, *mxtrap;
mwSize i;
double *pr;
rhs[0] = mxCreateDoubleMatrix(1, ndim, mxREAL);
pr = mxGetPr(rhs[0]);
for( i=0; i<ndim; i++ ) {
pr[i] = dims[i];
}
rhs[1] = mxCreateString(classname);
if( mxtrap = mexCallMATLABWithTrap(1,&mx,2,rhs,"CreateClassArray") ) {
mxDestroyArray(mxtrap);
mx = NULL;
}
mxDestroyArray(rhs[1]);
mxDestroyArray(rhs[0]);
return mx;
}
Caution: The above is bare bones with NO ARGUMENT CHECKING. I will clean this up with more comments and put in argument checking and post to the FEX in the near future. Also, the above assumes R2008b or later. For R2008a there is no mexCallMATLABWithTrap function in the API. In that case download the FEX submission noted below for mxGetPropertyPtr and there is a replacement mexCallMATLABWithTrap function included.
You might also be interested in this FEX submission for getting the mxArray pointers to class element properties:

Plus de réponses (1)

Pavel Holoborodko
Pavel Holoborodko le 5 Avr 2011
Hi, James.
Thank you for your prompt and insightful answer. Actually I was hoping for answer from you :-). It is apparent that you are one of the MEX gurus around and I’ve been learning a lot from your posts relating to MEX development – thank you for your efforts helping others.
Additional thanks for drawing my attention to memory-wise inefficiency of mxGetProperty – it might hurt my MEX library too, since objects can be very large. Too many hacks needed for mixing new MATLAB OOP with MEX, don’t you think? Maybe it has sense to switch back to struct-based classes?
  8 commentaires
Pavel Holoborodko
Pavel Holoborodko le 11 Avr 2011
And sorry for late response.
Also I had no chance to prepare simple example since I found other issues in my MEX to be covered first - just to be sure to not make false statements.
Pavel Holoborodko
Pavel Holoborodko le 12 Avr 2011
I've finished my tests with large property passing. I was wrong - it works fine, Matlab passes large property without delay. Sorry for
misleading you.
P.S.
Looking forward to see what 2011a is offering.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Write C Functions Callable from MATLAB (MEX Files) dans Help Center et File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by