MATLAB MEX (MATLAB Executable) allows users to create custom functions in C, C++, or Fortran that can be called directly from MATLAB, enhancing performance and extending functionality.
% Example MEX function in C to add two numbers
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
double *a, *b, *c;
a = mxGetPr(prhs[0]);
b = mxGetPr(prhs[1]);
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
c = mxGetPr(plhs[0]);
c[0] = a[0] + b[0];
}
What is MATLAB MEX?
MATLAB MEX stands for MATLAB Executable, a powerful feature that allows users to write C or C++ code to be executed in MATLAB. This integration provides a bridge between high-performance compiled code and MATLAB’s flexible environment, enabling users to execute computationally intensive algorithms with greater efficiency. MEX is particularly beneficial when you need to leverage existing libraries written in C/C++ or when performance is paramount for your applications.

Benefits of Using MEX
Using MEX offers several key advantages:
- Performance Improvements: By compiling code into a MEX file, you can achieve substantial performance enhancements over MATLAB's interpreted language for computationally intensive tasks.
- Reusability of Existing Code: If you have existing C/C++ code, MEX allows you to quickly integrate that functionality into MATLAB without extensive rewriting.
- Access to Low-Level System Capabilities: MEX provides options to interact with low-level system functionalities that would be cumbersome with high-level MATLAB functions. This access allows performing tasks such as direct memory manipulation or interfacing with hardware.

Setting Up Your Environment
System Requirements
Before diving into MEX, ensure that your system meets the following requirements:
- Operating Systems Compatibility: MEX supports various operating systems, including Windows, macOS, and Linux. Ensure your MATLAB installation is specified for your OS.
- Proper MATLAB Installation: Confirm that MATLAB is properly installed and configured on your system. This step includes enabling developer tools necessary for compiling your code.
Compiler Compatibility
MEX files require an appropriate C/C++ compiler. Different MATLAB versions support different compilers. To check or set up your compiler, use the command:
mex -setup
This command will guide you through selecting a compatible compiler for your MATLAB installation. Many common compilers like GCC for Linux or Microsoft Visual Studio for Windows are often used.

Creating a MEX File
Basic Structure of a MEX Function
Every MEX file essentially revolves around one function, which acts as an entry point for MATLAB. The prototype for this function is as follows:
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
In this prototype:
- nlhs: Number of left-hand side outputs (expected from MATLAB).
- plhs[]: An array of pointers to the left-hand side outputs.
- nrhs: Number of right-hand side inputs (provided from MATLAB).
- prhs[]: An array of pointers to the right-hand side inputs.
For a simple example, here’s how you can write a basic "Hello World" MEX file:
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
mexPrintf("Hello, World!\n");
}
In this function, `mexPrintf` outputs the message to the MATLAB command window.
Compiling a MEX File
Once you’ve written your MEX file (e.g., `hello_world.c`), you can compile it using the MATLAB command:
mex hello_world.c
Executing this command will create a `hello_world.mex*` file (where * will depend on your operating system). If any errors occur during compilation, MATLAB will usually provide helpful messages to guide you.

Function Parameters and Data Types
Understanding MATLAB Data Types in MEX
When creating MEX functions, it's essential to understand how MATLAB data types translate to C/C++. Here are common MATLAB data types and their C/C++ counterparts:
- double: `double` in C/C++
- char: `char` in C/C++
- cell: `mxArray *` in C/C++
- struct: `mxArray *` in C/C++
To work with input data from MATLAB, you can retrieve pointers using functions like `mxGetPr`, which gets the pointer to the real data of a numeric array. Here’s an example of accessing input data:
double *input;
input = mxGetPr(prhs[0]); // Retrieve pointer to the first input array
Input and Output Argument Handling
Handling multiple inputs and outputs in your MEX function gives you flexibility for complex operations. Here’s an example of a MEX function that adds two matrices:
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
double *matrixA, *matrixB, *result;
// Validate input
if (nrhs != 2) {
mexErrMsgIdAndTxt("MATLAB:add:invalidNumInputs", "Two inputs required.");
}
// Ensure the inputs are double
if (!mxIsDouble(prhs[0]) || !mxIsDouble(prhs[1])) {
mexErrMsgIdAndTxt("MATLAB:add:inputNotDouble", "Input must be type double.");
}
// Get input pointers
matrixA = mxGetPr(prhs[0]);
matrixB = mxGetPr(prhs[1]);
// Assume matrix size compatibility; allocate memory for result
plhs[0] = mxCreateDoubleMatrix(m, n, mxREAL);
result = mxGetPr(plhs[0]);
// Perform addition
for (int i = 0; i < m * n; i++) {
result[i] = matrixA[i] + matrixB[i];
}
}
In this example, it’s crucial to check that the correct number of inputs is provided and to validate their types.

Debugging and Error Handling in MEX
Common Debugging Techniques
Debugging MEX files can be tricky. A useful strategy is using MATLAB’s `dbstop` command, which allows you to set breakpoints. For example:
dbstop if error
This command will stop execution and give you insight into what went wrong.
Error Handling Strategies
In MEX functions, it is important to return meaningful error messages back to MATLAB. You can utilize `mexErrMsgIdAndTxt` for this purpose to convey specific error IDs and messages accurately. Here’s how to implement it:
if (nrhs != 2) {
mexErrMsgIdAndTxt("MATLAB:add:invalidNumInputs", "Two inputs required.");
}
This approach enhances the user experience by providing direct feedback on usage.

Performance Optimization Techniques
Profiling MEX Functions
Profiling is essential for understanding where performance bottlenecks lie. MATLAB provides a powerful profiler that can be invoked via:
profile on
After running your MEX function, call `profile viewer` to analyze which parts of your code are consuming the most time.
Optimizing Code
Optimization can often lead to significant performance gains. Ensure your code avoids unnecessary memory allocations and uses pointers effectively. Consider using `inline` functions, efficient loop structures, and caching results of expensive calculations when possible.

Advanced MEX Functionality
Using C++ with MEX
Utilizing C++ can offer enhanced functionalities like object-oriented programming. With classes, you can encapsulate data and methods, leading to cleaner and more maintainable code structures. Here’s an outline of how you might define a simple class:
class SimpleClass {
public:
SimpleClass() {}
void display() { mexPrintf("This is a SimpleClass object.\n"); }
};
Multithreading in MEX
For computationally intensive applications, consider implementing multithreading using libraries like OpenMP. This allows parts of your code to run simultaneously, potentially speeding up execution times dramatically:
#pragma omp parallel for
for (int i = 0; i < n; i++) {
// Perform computations
}
Remember to handle shared resources carefully to avoid race conditions.

Integrating MEX with Other Toolboxes
MEX can harness specialized MATLAB toolboxes. For instance, if you’re working with signal processing, you can call functions directly within a MEX file, allowing for greater flexibility and efficiency.
Consider a case where an algorithm is implemented in C/C++ but requires MATLAB’s built-in FFT function; interoperability allows seamless integration and enhanced performance.

Conclusion
In summary, mastering MATLAB MEX extends the capabilities of MATLAB, allowing access to high-performance computing and existing codebases. By incorporating C/C++ functions, validating inputs, and efficiently debugging, you can create powerful tools that leverage the best of both worlds.
Experimentation is vital: don’t hesitate to try writing your custom MEX functions and explore ways to optimize your workflow.

Additional Resources
For further learning, refer to the official MathWorks MEX documentation. Additionally, explore books and journals focused on MEX file creation and optimization techniques to boost your understanding and capabilities.

FAQs about MATLAB MEX
What types of functions can be created with MEX?
You can create a wide range of functions, including those for mathematical computations, data processing tasks, or any C/C++ functions that benefit from being executed at high speed.
Are there limitations when using MEX files?
Yes, MEX files do not support all MATLAB features and functions. For example, you cannot use graphical functions directly in MEX, and certain data types might require additional handling.
How do I share MEX files with others?
You can share your compiled MEX files with others; however, ensure they have compatible versions of MATLAB and the necessary compilers installed on their systems.