使用MATIO库读取Matlab结构体(struct)数据的示例程序
MATIO是一个用于读写Matlab数据文件(.mat)的C/C++库。下面是一个完整的示例程序,展示如何使用MATIO库读取Matlab中的struct结构数据。
示例程序
#include <stdio.h>
#include <stdlib.h>
#include <matio.h>
int main(int argc, char **argv) {
// 检查命令行参数
if (argc != 2) {
fprintf(stderr, "Usage: %s <matfile>\n", argv[0]);
return EXIT_FAILURE;
}
// 打开MAT文件
mat_t *matfp = Mat_Open(argv[1], MAT_ACC_RDONLY);
if (matfp == NULL) {
fprintf(stderr, "Error opening MAT file %s\n", argv[1]);
return EXIT_FAILURE;
}
// 读取文件中的所有变量
matvar_t *matvar;
while ((matvar = Mat_VarReadNextInfo(matfp)) != NULL) {
// 只处理结构体类型的变量
if (matvar->class_type == MAT_C_STRUCT) {
printf("\nFound struct variable: %s\n", matvar->name);
printf("Struct has %d fields\n", matvar->internal->num_fields);
// 读取完整的结构体数据
matvar_t *struct_var = Mat_VarRead(matfp, matvar->name);
if (struct_var == NULL) {
fprintf(stderr, "Error reading struct variable %s\n", matvar->name);
Mat_VarFree(matvar);
continue;
}
// 遍历结构体的所有字段
for (int i = 0; i < struct_var->internal->num_fields; i++) {
const char *fieldname = struct_var->internal->fieldnames[i];
matvar_t *field = Mat_VarGetStructFieldByName(struct_var, fieldname, 0);
if (field != NULL) {
printf(" Field %d: %s (class type: %d)\n", i, fieldname, field->class_type);
// 根据字段类型处理数据
switch (field->class_type) {
case MAT_C_DOUBLE: {
double *data = (double *)field->data;
printf(" Type: double, size: %d x %d\n",
field->dims[0], field->dims[1]);
// 打印前几个元素
int num_to_print = field->dims[0] * field->dims[1];
num_to_print = num_to_print > 5 ? 5 : num_to_print;
for (int j = 0; j < num_to_print; j++) {
printf(" data[%d] = %f\n", j, data[j]);
}
break;
}
case MAT_C_SINGLE: {
float *data = (float *)field->data;
printf(" Type: float, size: %d x %d\n",
field->dims[0], field->dims[1]);
break;
}
case MAT_C_INT32: {
int32_t *data = (int32_t *)field->data;
printf(" Type: int32, size: %d x %d\n",
field->dims[0], field->dims[1]);
break;
}
case MAT_C_CHAR: {
char *data = (char *)field->data;
printf(" Type: char, size: %d x %d\n",
field->dims[0], field->dims[1]);
printf(" String: %.*s\n",
field->dims[0] * field->dims[1], data);
break;
}
case MAT_C_STRUCT: {
printf(" Type: nested struct\n");
break;
}
default:
printf(" Unhandled type: %d\n", field->class_type);
}
}
}
// 释放结构体变量
Mat_VarFree(struct_var);
}
// 释放变量信息
Mat_VarFree(matvar);
}
// 关闭MAT文件
Mat_Close(matfp);
return EXIT_SUCCESS;
}
编译说明
要编译这个程序,你需要先安装MATIO库。在Linux系统上,可以使用以下命令安装:
sudo apt-get install libmatio-dev # Debian/Ubuntu
然后使用gcc编译:
gcc -o read_mat_struct read_mat_struct.c -lmatio
使用示例
假设你有一个Matlab文件data.mat
,其中包含一个名为mystruct
的结构体:
mystruct.field1 = 42;
mystruct.field2 = 'hello';
mystruct.field3 = [1, 2, 3];
运行程序:
./read_mat_struct data.mat
程序说明
- 程序首先打开指定的MAT文件
- 然后遍历文件中的所有变量,查找结构体类型的变量
- 对于每个结构体变量,程序会:
- 打印结构体名称和字段数量
- 遍历所有字段并打印字段名和类型
- 根据字段类型打印部分数据内容
- 最后关闭MAT文件并释放资源
注意事项
- 这个示例处理了几种常见的数据类型(double, float, int32, char),你可以根据需要扩展其他类型的处理
- 对于嵌套结构体,程序只识别但不深入处理,你可以递归调用处理函数来实现
- 记得检查所有可能的错误情况,特别是在内存分配和文件操作时
希望这个示例能帮助你使用MATIO库读取Matlab结构体数据!