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