使用MATIO庫寫入MATLAB結構體(struct)數據的示例程序
MATIO是一個用于讀寫MATLAB數據文件(.mat)的開源C庫。下面是一個完整的示例程序,展示如何使用MATIO庫創建一個包含結構體數據的MAT文件。
示例程序
#include <stdio.h>
#include <stdlib.h>
#include <matio.h>int main() {// 初始化mat文件mat_t *matfp = Mat_CreateVer("struct_example.mat", NULL, MAT_FT_MAT5);if (matfp == NULL) {fprintf(stderr, "Error creating MAT file\n");return EXIT_FAILURE;}// 創建結構體字段名稱const char *fields[] = {"name", "value", "data"};size_t struct_dims[2] = {1, 1}; // 1x1結構體// 創建結構體數組matvar_t *struct_array = Mat_VarCreateStruct("my_struct", 2, struct_dims, fields, 3);if (struct_array == NULL) {fprintf(stderr, "Error creating struct variable\n");Mat_Close(matfp);return EXIT_FAILURE;}// 添加第一個字段: name (字符串)const char *name = "example struct";size_t name_dims[2] = {1, strlen(name)};matvar_t *name_var = Mat_VarCreate(NULL, MAT_C_CHAR, MAT_T_UINT8, 2, name_dims, (void*)name, 0);if (name_var == NULL) {fprintf(stderr, "Error creating name variable\n");Mat_VarFree(struct_array);Mat_Close(matfp);return EXIT_FAILURE;}Mat_VarSetStructFieldByName(struct_array, "name", 0, name_var);// 添加第二個字段: value (雙精度浮點數)double value = 3.14159;size_t value_dims[2] = {1, 1};matvar_t *value_var = Mat_VarCreate(NULL, MAT_C_DOUBLE, MAT_T_DOUBLE, 2, value_dims, &value, 0);if (value_var == NULL) {fprintf(stderr, "Error creating value variable\n");Mat_VarFree(struct_array);Mat_Close(matfp);return EXIT_FAILURE;}Mat_VarSetStructFieldByName(struct_array, "value", 0, value_var);// 添加第三個字段: data (2x3矩陣)double data[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};size_t data_dims[2] = {2, 3};matvar_t *data_var = Mat_VarCreate(NULL, MAT_C_DOUBLE, MAT_T_DOUBLE, 2, data_dims, data, 0);if (data_var == NULL) {fprintf(stderr, "Error creating data variable\n");Mat_VarFree(struct_array);Mat_Close(matfp);return EXIT_FAILURE;}Mat_VarSetStructFieldByName(struct_array, "data", 0, data_var);// 將結構體寫入文件if (Mat_VarWrite(matfp, struct_array, MAT_COMPRESSION_NONE) != 0) {fprintf(stderr, "Error writing variable to file\n");}// 清理資源Mat_VarFree(struct_array);Mat_Close(matfp);printf("MAT file with struct created successfully!\n");return EXIT_SUCCESS;
}
編譯說明
要編譯此程序,你需要先安裝MATIO庫。在Linux系統上,可以使用以下命令安裝:
sudo apt-get install libmatio-dev
然后使用gcc編譯:
gcc -o mat_struct_example mat_struct_example.c -lmatio
程序說明
- 程序創建了一個名為"struct_example.mat"的MAT文件
- 文件中包含一個名為"my_struct"的結構體變量
- 結構體包含三個字段:
- “name”: 字符串類型
- “value”: 雙精度標量
- “data”: 2x3雙精度矩陣
在MATLAB中驗證
生成的.mat文件可以在MATLAB中加載并檢查:
load('struct_example.mat');
disp(my_struct);
disp(my_struct.name);
disp(my_struct.value);
disp(my_struct.data);
注意事項
- 確保在程序結束時釋放所有分配的資源以避免內存泄漏
- 檢查每個MATIO函數的返回值以確保操作成功
- 對于大型數據,考慮使用MAT_COMPRESSION_ZLIB進行壓縮
- 結構體可以嵌套,即結構體字段可以是另一個結構體
這個示例展示了MATIO庫的基本用法,你可以根據需要擴展它來處理更復雜的數據結構。