How to create a 2d sparse matrix in a MEX-file written in C. After creating the matrix how to access the elements individually like in C , say mat[i][j]
?
I tired using mxCreateNumericArray
function but I wasn't able to access the elements and also make it as a sparse matrix.
Please help
Description. S = sparse( A ) converts a full matrix into sparse form by squeezing out any zero elements. If a matrix contains many zeros, converting the matrix to sparse storage saves memory. S = sparse( m,n ) generates an m -by- n all zero sparse matrix.
The two major benefits of using sparse matrix instead of a simple matrix are: Storage: There are lesser non-zero elements than zeros and thus lesser memory can be used to store only those elements. Computing time: Computing time can be saved by logically designing a data structure traversing only non-zero elements.
Sparse matrix is a matrix which contains very few non-zero elements. When a sparse matrix is represented with a 2-dimensional array, we waste a lot of space to represent that matrix. For example, consider a matrix of size 100 X 100 containing only 10 non-zero elements.
See this page on mxCreateSparse. Then you'll want to look at mxSetPr, mxSetIr and mxSetJc and the corresponding "get" versions.
Here's an example of how to allocate a sparse matrix. I realize this is an old link, but to the best of my knowledge, it hasn't changed.
Basically, how it works is that the ir
data contains the row indices. The jr
data contains a list of indices into the ir
array. For instance, in the link on how to allocate a sparse matrix, the code:
...
static double static_pr_data[NZMAX] = {5.8, 6.2, 5.9, 6.1};
static int static_ir_data[NZMAX] = {0, 2, 1, 3};
static int static_jc_data[COLS+1] = {0, 2, 4};
...
the array static_jc_data
tells you that indices static_jc_data[c]
through static_jc_data[c+1]-1
of static_pr_data
and static_ir_data
correspond to the column c
of the matrix. Within that range (static_jc_data[c]
to static_jc_data[c+1]-1
) the entries of static_pr_data
gives you the values in the matrix and static_ir_data
gives you the correct rows.
For example, the matrix here would be:
A = [ 5.8 0
0 5.9
6.2 0
0 6.1];
To answer your questions about how to access elements individually, you have to search for whether the i,j
th element exists and if it does return it, otherwise return 0. To do this, you'd search from static_ir_data[static_jc_data[j]]
through static_ir_data[static_jc_data[j+1]-1]
to see whether your i
exists. If it does, then the corresponding entry in static_pr_data
will contain your entry. If it doesn't, then return 0.
However, typically with sparse matrix usage, if you're doing a lot of searching through the matrix to see if a certain element exists, you may want to think about how you're using it. Typically, it's much better to perform whatever operation you're doing by only going through the non-zero elements once instead of searching for each i,j
th entry.
Oh, and one last thing. Keep in mind that in the MEX code, all your indices are 0 based, but they are 1 based in MATLAB. That should add to the fun.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With