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);