octave: Cell Arrays with Mex-Files
A.2.4 Cell Arrays with Mex-Files
--------------------------------
One can perform exactly the same operations on Cell arrays in mex-files
as in oct-files. An example that duplicates the function of the
‘celldemo.cc’ oct-file in a mex-file is given by ‘mycell.c’ as shown
below.
#include "mex.h"
void
mexFunction (int nlhs, mxArray* plhs[],
int nrhs, const mxArray* prhs[])
{
mwSize n;
mwIndex i;
if (nrhs != 1 || ! mxIsCell (prhs[0]))
mexErrMsgTxt ("ARG1 must be a cell");
n = mxGetNumberOfElements (prhs[0]);
n = (n > nlhs ? nlhs : n);
for (i = 0; i < n; i++)
plhs[i] = mxDuplicateArray (mxGetCell (prhs[0], i));
}
The output is identical to the oct-file version as well.
[b1, b2, b3] = mycell ({1, [1, 2], "test"})
⇒
b1 = 1
b2 =
1 2
b3 = test
Note in the example the use of the ‘mxDuplicateArray’ function. This
is needed as the ‘mxArray’ pointer returned by ‘mxGetCell’ might be
deallocated. The inverse function to ‘mxGetCell’, used for setting Cell
values, is ‘mxSetCell’ and is defined as
void mxSetCell (mxArray *ptr, int idx, mxArray *val);
Finally, to create a cell array or matrix, the appropriate functions
are
mxArray *mxCreateCellArray (int ndims, const int *dims);
mxArray *mxCreateCellMatrix (int m, int n);