使用MATIO库读取Matlab数据文件中的多维数组
MATIO是一个用于读写Matlab数据文件(.mat)的开源C库。下面是一个完整的示例程序,展示如何使用MATIO库读取Matlab数据文件中的多维数组。
示例程序
c
#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;
}
const char *filename = argv[1];
// 打开Matlab数据文件
mat_t *matfp = Mat_Open(filename, MAT_ACC_RDONLY);
if (matfp == NULL) {
fprintf(stderr, "Error opening MAT file %s\n", filename);
return EXIT_FAILURE;
}
// 读取文件中的所有变量
matvar_t *matvar;
while ((matvar = Mat_VarReadNextInfo(matfp)) != NULL) {
printf("Found variable: %s\n", matvar->name);
// 检查变量是否为多维数组
if (matvar->rank > 2) {
printf(" It's a multidimensional array with rank %d\n", matvar->rank);
printf(" Dimensions: ");
for (int i = 0; i < matvar->rank; i++) {
printf("%d ", (int)matvar->dims[i]);
}
printf("\n");
// 实际读取数据(之前只读取了信息)
Mat_VarFree(matvar);
matvar = Mat_VarRead(matfp, matvar->name);
// 根据数据类型处理数据
switch (matvar->class_type) {
case MAT_C_DOUBLE: {
double *data = (double *)matvar->data;
printf(" Data type: double\n");
// 计算总元素数
size_t total = 1;
for (int i = 0; i < matvar->rank; i++) {
total *= matvar->dims[i];
}
// 打印前10个元素作为示例
printf(" First 10 elements: ");
for (size_t i = 0; i < (total > 10 ? 10 : total); i++) {
printf("%g ", data[i]);
}
printf("\n");
break;
}
case MAT_C_SINGLE: {
float *data = (float *)matvar->data;
printf(" Data type: single\n");
break;
}
case MAT_C_INT32: {
int32_t *data = (int32_t *)matvar->data;
printf(" Data type: int32\n");
break;
}
// 可以添加更多数据类型处理
default:
printf(" Unhandled data type: %d\n", matvar->class_type);
}
}
Mat_VarFree(matvar);
}
// 检查是否有读取错误
if (!Mat_VarReadNextInfo(matfp)) {
if (feof(matfp->fp)) {
printf("Reached end of file\n");
} else {
fprintf(stderr, "Error reading MAT file\n");
}
}
// 关闭文件
Mat_Close(matfp);
return EXIT_SUCCESS;
}
编译说明
要编译这个程序,你需要先安装MATIO库。在Linux系统上,可以使用以下命令安装:
bash
sudo apt-get install libmatio-dev # Ubuntu/Debian
然后使用gcc编译:
bash
gcc -o read_mat read_mat.c -lmatio
程序说明
- 程序接受一个.mat文件作为输入参数
- 使用
Mat_Open
打开Matlab数据文件 - 使用
Mat_VarReadNextInfo
遍历文件中的所有变量 - 对于每个变量,检查其维数(rank)是否大于2,如果是则认为是多维数组
- 根据数据类型(双精度、单精度、整型等)处理数据
- 打印数组的基本信息和部分数据作为示例
- 最后关闭文件并释放资源
注意事项
- 这个示例主要处理了double类型的数组,其他数据类型需要类似处理
- 实际应用中,你可能需要根据数组的维度进行更复杂的操作
- 记得总是释放分配的变量(
Mat_VarFree
)和关闭文件(Mat_Close
) - 对于非常大的数组,直接打印所有元素可能不实际
你可以根据需要修改这个示例程序,比如只读取特定名称的变量,或者对多维数组进行特定的处理操作。