2012-01-15 34 views
5

Tôi đang cố gắng liên kết mã C của tôi với MATLAB thông qua việc sử dụng hàm mex và tôi sợ rằng tôi khá bối rối. Cụ thể, tôi muốn biết liệu tôi có thể sử dụng các kiểu dữ liệu do người dùng định nghĩa riêng của tôi (chẳng hạn như cấu trúc Person trong ví dụ bên dưới). Tôi đã không đi qua bất cứ điều gì trong tài liệu hướng dẫn cho thấy rằng tôi có thể, nhưng nó sẽ là không may nếu điều này đã không được phép! Đây là những gì tôi có trong cách của một hàm cửa ngõ:Các cấu trúc do người dùng định nghĩa với hàm mex MATLAB

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

}

chức năng makePeople My được định nghĩa dưới đây:

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; 

}

Cuối cùng, đây là 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 

Mọi trợ giúp sẽ được đánh giá cao!

Trả lời

6

Trong MEX, cấu trúc MATLAB thuộc loại mxArray, không giống cấu trúc C tùy chỉnh của bạn Person. Vì vậy, bạn không thể chỉ gán:

people[count] = oPerson; 

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

Bạn sẽ phải điền vào MATLAB struct lĩnh vực lĩnh vực-by-, giống như cách bạn đã làm trong phần đầu của mã của bạn, thông qua mxSetField

Các vấn đề liên quan