tryingtosolve
tryingtosolve

Reputation: 803

Extracting data from a matlab struct in mex

I'm following this example but I'm not sure what I missed. Specifically, I have this struct in MATLAB:

a = struct; a.one = 1.0; a.two = 2.0; a.three = 3.0; a.four = 4.0;

And this is my test code in MEX ---

First, I wanted to make sure that I'm passing in the right thing, so I did this check:

int nfields = mxGetNumberOfFields(prhs[0]);
mexPrintf("nfields =%i \n\n", nfields);

And it does yield 4, since I have four fields.

However, when I tried to extract the value in field three:

tmp = mxGetField(prhs[0], 0, "three");
mexPrintf("data =%f \n\n",  (double *)mxGetData(tmp)  );

It returns data =1.000000. I'm not sure what I did wrong. My logic is that I want to get the first element (hence index is 0) of the field three, so I expected data =3.00000.

Can I get a pointer or a hint?

Upvotes: 0

Views: 263

Answers (1)

Tommaso Belluzzo
Tommaso Belluzzo

Reputation: 23685

EDITED

Ok, since you didn't provide your full code but you are working on a test, let's try to make a new one from scratch.

On Matlab side, use the following code:

a.one = 1;
a.two = 2;
a.three = 3;
a.four = 4;

read_struct(a);

Now, create and compile the MEX read_struct function as follows:

#include "mex.h"

void read_struct(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    if (nrhs != 1)
        mexErrMsgTxt("One input argument required.");

    /* Let's check if the input is a struct... */
    if (!mxIsStruct(prhs[0]))
        mexErrMsgTxt("The input must be a structure.");

    int ne = mxGetNumberOfElements(prhs[0]);
    int nf = mxGetNumberOfFields(prhs[0]);

    mexPrintf("The structure contains %i elements and %i fields.\n", ne, nf);

    mwIndex i;
    mwIndex j;

    mxArray *mxValue; 
    double *value;

    for (i = 0; i < nf; ++i)
    {
        for (j = 0; j < ne; ++j)
        {
            mxValue = mxGetFieldByNumber(prhs[0], j, i);
            value = mxGetPr(mxValue);

            mexPrintf("Field %s(%d) = %.1f\n", mxGetFieldNameByNumber(prhs[0],i), j, value[0]);
        }
    }

    return;
}

Does this correctly prints your structure?

Upvotes: 1

Related Questions