Efficient large matrix operations in C MEX S-functions
5 views (last 30 days)
Show older comments
In custom programmed C MEX S-functions I need to perform operations using large three-dimensional matrices (in the order of 300k ... 10M data points). The C MEX S-functions also contain inputs and outputs of such size. In the C MEX S-functions, the 3d-data is inherently handled as vectors which therefore require proper indexing.
Currently, I'm using three nested for-loops (for every dimension) to acces the 3d-matrix data and to write output data - one data point at a time. Is there a way or are there recommended practices on how to increase computational perfomance in such case? I'm thinking of matrix multiplication or similar operations. It seems using nested for-loops yield in bad computational efficiency, even though I use C MEX S-functions which are compiled before executing the Simulink model.
2 Comments
James Tursa
on 17 Oct 2023
Writing text or binary? What will be reading this output data? How is writing output data related to matrix multiplication or similar operations?
Answers (1)
Dheeraj
on 26 Oct 2023
Hi,
I understand you are trying to improve performance of your C MEX S-functions when working with large three-dimensional matrices. There are a few things you can do to improve the computational performance of your C MEX S-functions for large 3D matrices.
- Avoid nested for loops: Nested for loops can be very inefficient for large matrices, as they require the compiler to generate a lot of redundant code. Instead, try to use vectorized operations whenever possible. For example, instead of using a nested for loop to multiply two 3D matrices, you could use a library function such as BLAS or LAPACK.
- Use efficient data structures. When working with large matrices, it is important to use data structures that are efficient for both memory usage and computation. For example, instead of storing your matrices as simple arrays, you could use a sparse matrix format. Sparse matrix formats are particularly efficient for matrices that are mostly empty.
- Also, you’ve used nested loops for both reading and writing data, you could use multi-threading if there is no race conditions on the matrices.
Hope this Helps!
0 Comments
See Also
Categories
Find more on Block and Blockset Authoring in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!