2012-01-15 35 views
5

我想通过使用mex函数将我的C代码链接到MATLAB,恐怕我很困惑。具体来说,我想知道我是否可以使用自己的用户定义的数据类型(例如下面示例中的Person结构)。我没有在文档中找到任何证据表明我能做到,但如果不允许这样做会很不幸!下面是我在一个网关功能的方法:用户定义的结构与MATLAB mex功能

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; 

}

最后,这里的person.h:}

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); 

我makePeople函数的定义如下文件:

#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 

任何帮助将不胜感激!

回答

6

在MEX中,MATLAB结构的类型为mxArray,这与您的自定义C结构Person完全无关。因此,你不能只是分配:

people[count] = oPerson; 

// people is defined as: mxArray* 
// oPerson is defined as: Person 

你将不得不填补MATLAB结构场逐场,你在你的代码的开头做了同样的方式,通过mxSetField