MATLAB Answers

0

How to use object arrays in MEX

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

  0 Comments

Sign in to comment.

Tags

2 Answers

Answer by James Tursa
on 4 Apr 2011
 Accepted Answer

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:

  0 Comments

Sign in to comment.


Answer by 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

I'm using Visual C++ 2010, so just placing "extern" in front of the functions declarations was enough (mangled names produced by VC++ 2010 coincide with ones produced by VC++ 2005 which was used for libmx.dll compilation).
Hidden functions (but mistakenly exported) are all mangled, public exported with extern "C" for compatibility.
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.
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.