Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to access a matrix in a matlab struct's field from a mex function?

Tags:

struct

matlab

mex

I'm trying to figure out how to access a matrix that is stored in a field in a matlab structure from a mex function.

That's awfully long winded... Let me explain:

I have a matlab struct that was defined like the following:

matrixStruct = struct('matrix', {4, 4, 4; 5, 5, 5; 6, 6 ,6})

I have a mex function in which I would like to be able to receive a pointer to the first element in the matrix (matrix[0][0], in c terms), but I've been unable to figure out how to do that.

I have tried the following:

/* Pointer to the first element in the matrix (supposedly)... */
double *ptr = mxGetPr(mxGetField(prhs[0], 0, "matrix");  

/* Incrementing the pointer to access all values in the matrix */
for(i = 0; i < 3; i++){  
    printf("%f\n", *(ptr + (i * 3)));
    printf("%f\n", *(ptr + 1 + (i * 3)));
    printf("%f\n", *(ptr + 2 + (i * 3)));
}

What this ends up printing is the following:

4.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000

I have also tried variations of the following, thinking that perhaps it was something wonky with nested function calls, but to no avail:

/* Pointer to the first location of the mxArray */
mxArray *fieldValuePtr = mxGetField(prhs[0], 0, "matrix");

/* Get the double pointer to the first location in the matrix */
double *ptr = mxGetPr(fieldValuePtr);

/* Same for loop code here as written above */

Does anyone have an idea as to how I can achieve what I'm trying to, or what I am potentially doing wrong?

Thanks!

Edit: As per yuk's comment, I tried doing similar operations on a struct that has a field called array which is a one-dimensional array of doubles.

The struct containing the array is defined as follows:

arrayStruct = struct('array', {4.44, 5.55, 6.66})

I tried the following on the arrayStruct from within the mex function:

mptr = mxGetPr(mxGetField(prhs[0], 0, "array"));

printf("%f\n", *(mptr));
printf("%f\n", *(mptr + 1));
printf("%f\n", *(mptr + 2));

...but the output followed what was printed earlier:

4.440000
0.000000
0.000000
like image 252
B. Ruschill Avatar asked May 11 '10 18:05

B. Ruschill


1 Answers

struct('field', {a b c}) is a special form of the struct constructor which creates a struct array that is the same size as the cell array, putting each element of the cell into field 'field' of the corresponding element of the struct. That is, this:

s = struct('field', {a b c});

produces the same result as this:

s(1).field = a;
s(2).field = b;
s(3).field = c;

The solution to your problem is to use square brackets to form a regular (non-cell) array, like this:

matrixStruct = struct('matrix', [4, 4, 4; 5, 5, 5; 6, 6 ,6]);
like image 162
SCFrench Avatar answered Sep 18 '22 04:09

SCFrench