Sophie

Sophie

distrib > Mageia > 7 > x86_64 > by-pkgid > 641ebb3060c35990cc021d8f7aaf9aca > files > 561

octave-doc-5.1.0-7.1.mga7.noarch.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Created by GNU Texinfo 6.5, http://www.gnu.org/software/texinfo/ -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Working with Matrices and Arrays in Mex-Files (GNU Octave (version 5.1.0))</title>

<meta name="description" content="Working with Matrices and Arrays in Mex-Files (GNU Octave (version 5.1.0))">
<meta name="keywords" content="Working with Matrices and Arrays in Mex-Files (GNU Octave (version 5.1.0))">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<link href="index.html#Top" rel="start" title="Top">
<link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Mex_002dFiles.html#Mex_002dFiles" rel="up" title="Mex-Files">
<link href="Character-Strings-in-Mex_002dFiles.html#Character-Strings-in-Mex_002dFiles" rel="next" title="Character Strings in Mex-Files">
<link href="Getting-Started-with-Mex_002dFiles.html#Getting-Started-with-Mex_002dFiles" rel="prev" title="Getting Started with Mex-Files">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.indentedblock {margin-right: 0em}
blockquote.smallindentedblock {margin-right: 0em; font-size: smaller}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smalllisp {margin-left: 3.2em}
kbd {font-style: oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nolinebreak {white-space: nowrap}
span.roman {font-family: initial; font-weight: normal}
span.sansserif {font-family: sans-serif; font-weight: normal}
ul.no-bullet {list-style: none}
-->
</style>
<link rel="stylesheet" type="text/css" href="octave.css">


</head>

<body lang="en">
<a name="Working-with-Matrices-and-Arrays-in-Mex_002dFiles"></a>
<div class="header">
<p>
Next: <a href="Character-Strings-in-Mex_002dFiles.html#Character-Strings-in-Mex_002dFiles" accesskey="n" rel="next">Character Strings in Mex-Files</a>, Previous: <a href="Getting-Started-with-Mex_002dFiles.html#Getting-Started-with-Mex_002dFiles" accesskey="p" rel="prev">Getting Started with Mex-Files</a>, Up: <a href="Mex_002dFiles.html#Mex_002dFiles" accesskey="u" rel="up">Mex-Files</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Working-with-Matrices-and-Arrays-in-Mex_002dFiles-1"></a>
<h4 class="subsection">A.2.2 Working with Matrices and Arrays in Mex-Files</h4>

<p>The basic mex type of all variables is <code>mxArray</code>.  Any object, such as a
matrix, cell array, or structure, is stored in this basic type.  <code>mxArray</code>
serves essentially the same purpose as the <code>octave_value</code> class in
oct-files in that it acts as a container for all the more specialized types.
</p>
<p>The <code>mxArray</code> structure contains at a minimum, the name of the variable it
represents, its dimensions, its type, and whether the variable is real or
complex.  It can also contain a number of additional fields depending on the
type of the <code>mxArray</code>.  There are a number of functions to create
<code>mxArray</code> structures, including <code>mxCreateDoubleMatrix</code>,
<code>mxCreateCellArray</code>, <code>mxCreateSparse</code>, and the generic
<code>mxCreateNumericArray</code>.
</p>
<p>The basic function to access the data in an array is <code>mxGetPr</code>.  Because
the mex interface assumes that real and imaginary parts of a complex array are
stored separately, there is an equivalent function <code>mxGetPi</code> that gets the
imaginary part.  Both of these functions are only for use with double precision
matrices.  The generic functions <code>mxGetData</code> and <code>mxGetImagData</code>
perform the same operation for all matrix types.  For example:
</p>
<div class="example">
<pre class="example">mxArray *m;
mwSize *dims;
UINT32_T *pr;

dims = (mwSize *) mxMalloc (2 * sizeof (mwSize));
dims[0] = 2; dims[1] = 2;
m = mxCreateNumericArray (2, dims, mxUINT32_CLASS, mxREAL);
pr = (UINT32_T *) mxGetData (m);
</pre></div>

<p>There are also the functions <code>mxSetPr</code>, etc., that perform the inverse,
and set the data of an array to use the block of memory pointed to by the
argument of <code>mxSetPr</code>.
</p>
<p>Note the type <code>mwSize</code> used above, and also <code>mwIndex</code>, are defined as
the native precision of the indexing in Octave on the platform on which the
mex-file is built.  This allows both 32- and 64-bit platforms to support
mex-files.  <code>mwSize</code> is used to define array dimensions and the maximum
number or elements, while <code>mwIndex</code> is used to define indexing into
arrays.
</p>
<p>An example that demonstrates how to work with arbitrary real or complex double
precision arrays is given by the file <samp>mypow2.c</samp> shown below.
</p>
<div class="example">
<pre class="verbatim">#include &quot;mex.h&quot;

void
mexFunction (int nlhs, mxArray *plhs[],
             int nrhs, const mxArray *prhs[])
{
  mwSize n;
  mwIndex i;
  double *vri, *vro;

  if (nrhs != 1 || ! mxIsDouble (prhs[0]))
    mexErrMsgTxt (&quot;ARG1 must be a double matrix&quot;);

  n = mxGetNumberOfElements (prhs[0]);
  plhs[0] = mxCreateNumericArray (mxGetNumberOfDimensions (prhs[0]),
                                  mxGetDimensions (prhs[0]),
                                  mxGetClassID (prhs[0]),
                                  mxIsComplex (prhs[0]));
  vri = mxGetPr (prhs[0]);
  vro = mxGetPr (plhs[0]);

  if (mxIsComplex (prhs[0]))
    {
      double *vii, *vio;
      vii = mxGetPi (prhs[0]);
      vio = mxGetPi (plhs[0]);

      for (i = 0; i &lt; n; i++)
        {
          vro[i] = vri[i] * vri[i] - vii[i] * vii[i];
          vio[i] = 2 * vri[i] * vii[i];
        }
    }
  else
    {
      for (i = 0; i &lt; n; i++)
        vro[i] = vri[i] * vri[i];
    }
}
</pre></div>

<p>An example of its use is
</p>
<div class="example">
<pre class="example">b = randn (4,1) + 1i * randn (4,1);
all (b.^2 == mypow2 (b))
&rArr; 1
</pre></div>

<p>The example above uses the functions <code>mxGetDimensions</code>,
<code>mxGetNumberOfElements</code>, and <code>mxGetNumberOfDimensions</code> to work with
the dimensions of multi-dimensional arrays.  The functions <code>mxGetM</code>, and
<code>mxGetN</code> are also available to find the number of rows and columns in a
2-D matrix (MxN matrix).
</p>
<hr>
<div class="header">
<p>
Next: <a href="Character-Strings-in-Mex_002dFiles.html#Character-Strings-in-Mex_002dFiles" accesskey="n" rel="next">Character Strings in Mex-Files</a>, Previous: <a href="Getting-Started-with-Mex_002dFiles.html#Getting-Started-with-Mex_002dFiles" accesskey="p" rel="prev">Getting Started with Mex-Files</a>, Up: <a href="Mex_002dFiles.html#Mex_002dFiles" accesskey="u" rel="up">Mex-Files</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>



</body>
</html>