How to use object arrays in MEX

3 views (last 30 days)
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

Accepted Answer

James Tursa
James Tursa on 4 Apr 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:

More Answers (1)

Pavel Holoborodko
Pavel Holoborodko on 5 Apr 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 Comments
Pavel Holoborodko
Pavel Holoborodko on 11 Apr 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 on 12 Apr 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.

Sign in to comment.

Categories

Find more on Write C Functions Callable from MATLAB (MEX Files) in Help Center and File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!