Sophie

Sophie

distrib > Mageia > 4 > i586 > by-pkgid > b38d2da330d1936e5ab1307c039c4941 > files > 482

octave-doc-3.6.4-3.mga4.noarch.rpm

<html lang="en">
<head>
<title>Structures with Mex-Files - GNU Octave</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="GNU Octave">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="Mex_002dFiles.html#Mex_002dFiles" title="Mex-Files">
<link rel="prev" href="Cell-Arrays-with-Mex_002dFiles.html#Cell-Arrays-with-Mex_002dFiles" title="Cell Arrays with Mex-Files">
<link rel="next" href="Sparse-Matrices-with-Mex_002dFiles.html#Sparse-Matrices-with-Mex_002dFiles" title="Sparse Matrices with Mex-Files">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
  pre.display { font-family:inherit }
  pre.format  { font-family:inherit }
  pre.smalldisplay { font-family:inherit; font-size:smaller }
  pre.smallformat  { font-family:inherit; font-size:smaller }
  pre.smallexample { font-size:smaller }
  pre.smalllisp    { font-size:smaller }
  span.sc    { font-variant:small-caps }
  span.roman { font-family:serif; font-weight:normal; } 
  span.sansserif { font-family:sans-serif; font-weight:normal; } 
--></style>
</head>
<body>
<div class="node">
<a name="Structures-with-Mex-Files"></a>
<a name="Structures-with-Mex_002dFiles"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Sparse-Matrices-with-Mex_002dFiles.html#Sparse-Matrices-with-Mex_002dFiles">Sparse Matrices with Mex-Files</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Cell-Arrays-with-Mex_002dFiles.html#Cell-Arrays-with-Mex_002dFiles">Cell Arrays with Mex-Files</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Mex_002dFiles.html#Mex_002dFiles">Mex-Files</a>
<hr>
</div>

<h4 class="subsection">A.2.5 Structures with Mex-Files</h4>

<p>The basic function to create a structure in a mex-file is
<code>mxCreateStructMatrix</code>, which creates a structure array with a two
dimensional matrix, or <code>mxCreateStructArray</code>.

<pre class="example">     mxArray *mxCreateStructArray (int ndims, int *dims,
                                   int num_keys,
                                   const char **keys);
     mxArray *mxCreateStructMatrix (int rows, int cols,
                                    int num_keys,
                                    const char **keys);
</pre>
   <p>Accessing the fields of the structure can then be performed with the
<code>mxGetField</code> and <code>mxSetField</code> or alternatively with the
<code>mxGetFieldByNumber</code> and <code>mxSetFieldByNumber</code> functions.

<pre class="example">     mxArray *mxGetField (const mxArray *ptr, mwIndex index,
                          const char *key);
     mxArray *mxGetFieldByNumber (const mxArray *ptr,
                                  mwIndex index, int key_num);
     void mxSetField (mxArray *ptr, mwIndex index,
                      const char *key, mxArray *val);
     void mxSetFieldByNumber (mxArray *ptr, mwIndex index,
                              int key_num, mxArray *val);
</pre>
   <p>A difference between the oct-file interface to structures and the
mex-file version is that the functions to operate on structures in
mex-files directly include an <code>index</code> over the elements of the
arrays of elements per <code>field</code>.  Whereas the oct-file structure
includes a Cell Array per field of the structure.

   <p>An example that demonstrates the use of structures in mex-file can be
found in the file <samp><span class="file">mystruct.c</span></samp>, as seen below

<pre class="example"><pre class="verbatim">     #include "mex.h"
     
     void
     mexFunction (int nlhs, mxArray* plhs[], int nrhs, 
                  const mxArray* prhs[])
     {
       int i;
       mwIndex j;
       mxArray *v;
       const char *keys[] = { "this", "that" };
     
       if (nrhs != 1 || ! mxIsStruct (prhs[0]))
         mexErrMsgTxt ("expects struct");
     
       for (i = 0; i &lt; mxGetNumberOfFields (prhs[0]); i++)
         for (j = 0; j &lt; mxGetNumberOfElements (prhs[0]); j++)
           {
             mexPrintf ("field %s(%d) = ", 
                        mxGetFieldNameByNumber (prhs[0], i), j);
             v = mxGetFieldByNumber (prhs[0], j, i);
             mexCallMATLAB (0, 0, 1, &amp;v, "disp");
           }
     
       v = mxCreateStructMatrix (2, 2, 2, keys);
     
       mxSetFieldByNumber (v, 0, 0, mxCreateString ("this1"));
       mxSetFieldByNumber (v, 0, 1, mxCreateString ("that1"));
       mxSetFieldByNumber (v, 1, 0, mxCreateString ("this2"));
       mxSetFieldByNumber (v, 1, 1, mxCreateString ("that2"));
       mxSetFieldByNumber (v, 2, 0, mxCreateString ("this3"));
       mxSetFieldByNumber (v, 2, 1, mxCreateString ("that3"));
       mxSetFieldByNumber (v, 3, 0, mxCreateString ("this4"));
       mxSetFieldByNumber (v, 3, 1, mxCreateString ("that4"));
     
       if (nlhs)
         plhs[0] = v;
     }
</pre>
     
</pre>
   <p>An example of the behavior of this function within Octave is then

<pre class="example">     a(1).f1 = "f11"; a(1).f2 = "f12";
     a(2).f1 = "f21"; a(2).f2 = "f22";
     b = mystruct(a)
     &rArr; field f1(0) = f11
         field f1(1) = f21
         field f2(0) = f12
         field f2(1) = f22
         b =
         {
           this =
     
           (,
             [1] = this1
             [2] = this2
             [3] = this3
             [4] = this4
           ,)
     
           that =
     
           (,
             [1] = that1
             [2] = that2
             [3] = that3
             [4] = that4
           ,)
     
         }
</pre>
   </body></html>