我有一个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);
}
即使这样可行,也不尽如人意,因为我们必须手动排列字段名称,并且必须使用不同的语法,具体取决于每个字符是否为数组。