使用MATIO库读取Matlab结构体(struct)数据的示例程序

发布于:2025-04-06 ⋅ 阅读:(18) ⋅ 点赞:(0)

使用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

程序说明

  1. 程序首先打开指定的MAT文件
  2. 然后遍历文件中的所有变量,查找结构体类型的变量
  3. 对于每个结构体变量,程序会:
    • 打印结构体名称和字段数量
    • 遍历所有字段并打印字段名和类型
    • 根据字段类型打印部分数据内容
  4. 最后关闭MAT文件并释放资源

注意事项

  • 这个示例处理了几种常见的数据类型(double, float, int32, char),你可以根据需要扩展其他类型的处理
  • 对于嵌套结构体,程序只识别但不深入处理,你可以递归调用处理函数来实现
  • 记得检查所有可能的错误情况,特别是在内存分配和文件操作时

希望这个示例能帮助你使用MATIO库读取Matlab结构体数据!


网站公告

今日签到

点亮在社区的每一天
去签到