将c结构转换为matlab结构的重复方法是什么?

时间:2015-04-25 02:59:37

标签: c matlab struct mex

我有一个c结构,我需要转换为matlab结构。 字段有不同的类型,有些是数组。 我正在寻找一种方法,它具有最小的样板/重复信息。

typedef struct {
  UINT32 time ;
  double px[2];
} data_s;

data_s   s;    
mxArray *fieldVal      ,
        *structArrayPtr;

structArrayPtr = mxCreateStructMatrix(1, 1, numFields, fieldNames);

我正在尝试更换以下内容,这太重复了。

fieldVal = mxCreateNumericMatrix(1, 1, mxUINT32_CLASS, mxREAL);
mxGetData(fieldVal)[0] = s.time;
mxSetField(structArrayPtr, 0, "time", fieldVal);

fieldVal = mxCreateNumericMatrix(1, 2, mxDOUBLE_CLASS, mxREAL);
mxGetData(fieldVal)[0] = s.px[0];
mxGetData(fieldVal)[1] = s.px[1];
mxSetField(structArrayPtr, 0, "px", fieldVal);

这个想法是这样的。

typedef struct {
    char *name ;
    int   type ;
    int   arity;
} fields_s;

const fields_s fields[] = {
    {"time", mxUINT32_CLASS, 1},
    {"px"  , mxDOUBLE_CLASS, 2}
};

void *tmp;

for (i = 0; i < numFields; i++) {
    fieldVal = mxCreateNumericMatrix(1, fields[i].arity, fields[i].type, mxREAL);
    switch (i) {
        case 0: tmp = &(s.time); break;
        case 1: tmp =   s.px   ; break; // don't take address of arrays
    }

    // hmm, can't sizeof() on a dereferenced void*.  
    // any solution other than repeating the field name?
    // and does this make bad assumptions about data representation being the same?
    memcpy(mxGetData(fieldVal), tmp, sizeof(*tmp) * fields[i].arity);

    mxSetField(structArrayPtr, 0, fields[i].name, fieldVal);
}

即使这样可行,也不尽如人意,因为我们必须手动排列字段名称,并且必须使用不同的语法,具体取决于每个字符是否为数组。

0 个答案:

没有答案
相关问题