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¶
mxGetNumberOfDimensionsreturns the number of dimensions (usually 2) of your matrix.
mxGetDimensionsreturns an array containing the size of each dimension of a matrix.
mxGetPrreturns a pointer to the (real part of the) data of the matrix.
mxCreateDoubleMatrixcreates 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