2012-01-15 22 views
5

C kodumu bir mex işlevinin kullanımı aracılığıyla MATLAB'a bağlamaya çalışıyorum ve korkarım oldukça kafam karıştı. Özellikle, kendi kullanıcı tanımlı veri türlerimi kullanabileceğim (örneğin aşağıdaki örnekte bulunan Kişi yapısı gibi) kullanıp kullanamayacağımı bilmek istiyorum. Yapabileceğimi önermek için belgelerdeki herhangi bir şeye rastlamadım ama buna izin verilmediyse talihsiz olurdu! Burada bir geçit işlevi yolunda ne var:Bir MATLAB mex işlevine sahip kullanıcı tanımlı yapılar

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; 

} Son

, burada person.h var:

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

}

Benim makePeople fonksiyonu aşağıda tanımlanmıştır 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 

Herhangi bir yardım çok takdir edilecektir!

cevap

6

MEX'te, MATLAB yapıları, özel C yapınıza Person gibi bir şey olmayan, mxArray türündedir. Bu nedenle, sadece atamak olamaz:

people[count] = oPerson; 

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

Sen MATLAB struct alan-alan, kendi kodunun başına yaptığı aynı şekilde doldurmak zorunda kalacak mxSetField

aracılığıyla