Cell Arrays with Mex-Files - Untitled
Description: Untitled

Next: Structures with Mex-Files, Previous: Character Strings in Mex-Files, Up: Mex-Files

#### A.2.4 Cell Arrays with Mex-Files

We can perform exactly the same operations in Cell arrays in mex-files as we can in oct-files. An example that reduplicates the functional of the `celldemo.cc` oct-file in a mex-file is given by `mycell.c` as below

         /*

         Copyright (C) 2006, 2007 John W. Eaton

         This file is part of Octave.

         Octave is free software; you can redistribute it and/or
         modify it under the terms of the GNU General Public License
         as published by the Free Software Foundation; either
         version 3  of the License, or (at your option) any later
         version.

         Octave is distributed in the hope that it will be useful,
         but WITHOUT ANY WARRANTY; without even the implied warranty
         of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
         See the GNU General Public License for more details.

         You should have received a copy of the GNU General Public
         License along with Octave; see the file COPYING.  If not,
         see <http://www.gnu.org/licenses/>.

         */

         #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 ("expects cell");

           n = mxGetNumberOfElements (prhs[0]);
           n = (n > nlhs ? nlhs : n);

           for (i = 0; i < n; i++)
             plhs[i] = mxDuplicateArray (mxGetCell (prhs[0], i));
         }

which as can be seen below has exactly the same behavior as the oct-file version.

         [b1, b2, b3] = mycell ({1, [1, 2], "test"})
         =>
         b1 =  1
         b2 =

            1   2

         b3 = test

Note in the example the use of the `mxDuplicateArry` function. This is needed as the `mxArray` pointer returned by `mxGetCell` might be deallocated. The inverse function to `mxGetCell` is `mcSetCell` 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);