I'm trying to link my C code to MATLAB through the use of a mex function, and I'm afraid I'm quite confused. Specifically, I want to know whether I can use my own user-defined data types (such as the Person struct in the example below). I haven't come across anything in the documentation to suggest that I can, but it would be unfortunate if this were not allowed! Here's what I have in the way of a gateway function:
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])  
{   
 int *inA;   
 int *inB;   
 const mxArray *people;   
 const char *fieldnames[5];  
 int numFields, i;  
 inA = (int *) mxGetPr(prhs[0]);  
 inB = (int *) mxGetPr(prhs[1]);  
 numFields = 5;  
 fieldnames[0] = "home";  
 fieldnames[1] = "work";  
 fieldnames[2] = "mode";  
 fieldnames[3] = "loc1";  
 fieldnames[4] = "loc2";  
 people = mxCreateStructMatrix(1000, 1, numFields, fieldnames);  
 for (i = 0; i < numFields; i++)  
 {  
    mxSetField(people,i,fieldnames[i],mxDuplicateArray(prhs[2]));  
 }  
 makePeople(inA, inB, people);  
}
My makePeople function is defined below:
void makePeople(int* A, int* B, Person* people)  
{  
 int MANHATTAN, BRONX, BROOKLYN, QUEENS, STATEN;  
 int i, j, k, p, q, n;  
 int count, home, work, mode;  
 double* loc1;  
 double* loc2;  
 Person oPerson;  
 n = 5;  
 count = 0;  
 MANHATTAN = 1;  
 BRONX = 2;  
 BROOKLYN = 3;  
 QUEENS = 4;  
 STATEN = 5;  
 for (i = 1; i <= n; i++)  
 {  
     for (j = 1; j <= n; j++)  
     {  
          for (k = 1; k <= 2; k++)  
          {  
               if (k == 1)  
                    q = A[n*i+j];  
               else  
                    q = B[n*i+j];  
               for (p = 1; p < q; p++)  
               {  
                    home = i;  
                    work = j;  
                    mode = k;  
                    if (home == MANHATTAN)  
                    {
                          loc1[0] = 2.4;  
                          loc1[1] = 2.4;  
                          loc2[0] = 3.7;  
                          loc2[1] = 3.4;  
                    }  
                    else
                    {  
                          loc1[0] = 3.4;  
                          loc1[1] = 4.4;
                          loc2[0] = 3.7;  
                          loc2[1] = 3.4;  
                    }
                    oPerson = Person_new(home, work, mode, loc1, loc2);  
                    people[count] = oPerson;  
                    count++;  
                    }  
              }  
        }  
  }  
  return;  
}
Finally, here's the person.h file:
 #ifndef PERSON_INCLUDED  
 #define PERSON_INCLUDED  
 typedef struct Person_str *Person;  
 Person Person_new(int home, int work, int mode, double* loc1, double* loc2);  
 #endif  
Any help would be greatly appreciated!
You can pass a MATLAB structure to the function and let MATLAB autoconvert the argument. Or you can pass a pointer to a structure, which avoids creating a copy of the structure.
A MEX file is a function, created in MATLAB, that calls a C/C++ program or a Fortran subroutine. A MEX function behaves just like a MATLAB script or function. To call a MEX function, use the name of the MEX file, without the file extension. The MEX file contains only one function or subroutine.
To change the default, use the mex -setup lang command. MATLAB displays a message with links to select a different default compiler. If you call mex -setup without the lang argument, then MATLAB displays information about the default C compiler. MATLAB also displays links to the other supported languages.
A C++ MEX function is a class that overrides the function call operator, operator() to create a function object or functor. These objects behave like MATLAB® functions that can accept inputs and return outputs.
In MEX, MATLAB structures are of type mxArray, which is nothing like your custom C structure Person. Therefore you cant just assign:
people[count] = oPerson;
// people is defined as: mxArray*
// oPerson is defined as: Person
You will have to fill the MATLAB struct field-by-field, the same way you did in the beginning of your code, through mxSetField
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