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:

> mexfunction.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