2012-01-15 11 views
5

mex関数を使用してCコードをMATLABにリンクしようとしていますが、私は非常に混乱していると思います。具体的には、自分のユーザー定義のデータ型(以下の例のPerson構造体など)を使用できるかどうかを知りたいと思います。私はできることを示唆するためにドキュメンテーションの何も出て来なかったが、これが許されなければそれは残念であろう!ここで私はゲートウェイ機能のように、持っているものです。MATLAB mex関数を持つユーザー定義の構造体

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機能を以下のように定義されています

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ですファイル:

#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

関連する問題