使用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结构体数据!