c - MATLAB C MEX API:直接进入结构?
问题描述
在纯 C 中,我可以打开一个二进制文件并将文件头直接读入一个结构中,非常简单。在 MATLAB 的 C-MEX API 中,这似乎是一个更乏味的过程。我必须 1:从字段名称数组初始化结构。mxArray
2:分别为每个结构字段初始化一个类型化。3:分别fread
进入mxArray
每个结构字段。mxArray
4:分别为每个结构字段分配一个(按编号或名称)。
有没有更简单的方法将数据直接读取到 MATLAB 结构中?
#pragma pack(2)
typedef struct file_header
{
int64_t preamble;
int16_t version;
int16_t mode;
int8_t software_name[32];
int32_t content;
// ...
// other fields
} file_header_t;
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
char *file_name = mxArrayToString(prhs[0]);
// read file header (C) /////////////////////////////////////////////////
file_header_t das_header;
FILE *fptr = fopen(file_name, "rb");
fread(&das_header, sizeof(file_header_t), 1, fptr);
fclose(fptr);
// read file header (MATLAB) ////////////////////////////////////////////
const int n_field = 37;
static const char *field_name[] = {
"preamble",
"version",
"mode",
"software_name",
"content"
// ...
// other field names
};
// init matlab struct
plhs[0] = mxCreateStructMatrix(1, 1, n_field, field_name);
// init mxArray containers for struct fields
mxArray *preamble = mxCreateNumericMatrix(1, 1, mxINT64_CLASS, mxREAL);
mxArray *version = mxCreateNumericMatrix(1, 1, mxINT16_CLASS, mxREAL);
mxArray *mode = mxCreateNumericMatrix(1, 1, mxINT16_CLASS, mxREAL);
mxArray *software_name = mxCreateNumericMatrix(1, 32, mxINT8_CLASS, mxREAL);
mxArray *content = mxCreateNumericMatrix(1, 1, mxINT32_CLASS, mxREAL);
// ...
// mxArray *all *subsequent *struct *fields;
fptr = fopen(file_name, "rb");
fread((int64_t*)mxGetData(preamble), 8, 1, fptr);
fread((int16_t*)mxGetData(version), 2, 1, fptr);
fread((int16_t*)mxGetData(mode), 2, 1, fptr);
fread((int8_t*)mxGetData(software_name), 1, 32, fptr);
fread((int32_t*)mxGetData(content), 4, 1, fptr);
// ...
// fread((type*)mxGetData(field_name), sizeof(type), 1, fptr);
fclose(fptr);
// assign field values
mxSetFieldByNumber(plhs[0], 0, 0, preamble);
mxSetFieldByNumber(plhs[0], 0, 1, version);
mxSetFieldByNumber(plhs[0], 0, 2, mode);
mxSetFieldByNumber(plhs[0], 0, 3, software_name);
mxSetFieldByNumber(plhs[0], 0, 4, content);
// ...
// mxSetFieldByNumber(plhs[0], 0, k, field_name);
}
解决方案
推荐阅读
- rust - 为什么是 &'a Box
被视为 &'a Box 而不是 &'a Box ? - c++ - 在 MS Visual Studio 观察窗口中,如何将函数返回的 int 格式化为 4 个字符值?
- python - 如何将数组从数组内部移动到新数组中 - python
- javascript - How can I stay in the same page in react (antd) table after page reload
- matlab - 应用 MATLAB sscanf 将列向量中的多个元素从十六进制转换为十进制
- javascript - 向多级手风琴添加活动类
- matlab - Matlab 表上的聚合
- vb.net - VB.NET 和 Access 数据库
- c# - Elasticsearch(C# nest):映射抽象属性
- c# - .NET Core 2.0 可以说 OData v2 吗?