Using mex-files with Matlab R2006b¶
Nested for loops can slow down your Matlab simulations considerably. The idea is to rewrite these parts of your code in C++ and build executable “mex”-code from it.
Setting up the build process¶
From the Matlab command line run:
> mex -setup
When asked, choose gccopts.sh for a linux system.
Overview¶
We intend to replace a ‹function›.m
by an executable ‹function›.mexglx
for linux by first rewriting the implementation of ‹function›.m
in a C++
file ‹function›.cpp
and then compiling it.
Mex basics¶
‹function›.cpp
must first #include "mex.h"
to be able to use all
C-functions prefixed by mx
or mex
.
‹function›.cpp
must contain one function called mexFunction
which
substitutes the function originally residing in ‹function›.m
:
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
// function implementation
}
The ‹function›.cpp
file can now be compiled on the Matlab command line:
> mex ‹function›.cpp
Handling data¶
The fundamental Matlab type in C is an mxArray
. The two arguments to the
mexFunction
are the left hand side and right hand side mxArrays
which
correspond to the output and input arguments respectively of the
‹function›.m
file.
mxArrays
can have different types. In Matlab, language type checking and
conversion is implicit, while in C++ you have to take care for it.
mxArrays
have a size just like Matlab matrices have. Conversely, plhs
and prhs
are C arrays of pointers to mxArrays
with sizes nlhs
and
nrhs
respectively.
While the``mxArrays`` in prhs are given to you, you are expected to create some
mxArrays
and store the pointers in plhs
.
Some example mexFunction
:
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL); //create an mxArray
double *d = mxGetPr(plhs[0]); //get a pointer to the data
d[0] = 0.1811;
}
This functions, when executed in Matlab always returns 0.1811.
Some useful mx...
functions¶
mxGetNumberOfDimensions
- returns the number of dimensions (usually 2) of your matrix.
mxGetDimensions
- returns an array containing the size of each dimension of a matrix.
mxGetPr
- returns a pointer to the (real part of the) data of the matrix.
mxCreateDoubleMatrix
- creates an mxArray for an ordinary matrix of given size.
Extensions¶
#include <math.h>
to store and load .mat
files.
Help¶
The Matlab help concerning mex-files resides here:
- Matlab > External Interfaces > Calling C and Fortran Programes from Matlab
- Matlab > External Interfaces > Creating C Language MEX-Files
- Matlab > C and Fortran Functions - By Category