一.概述
1..mat數據格式
(1).mat 是 MATLAB 軟件的標準二進制數據存儲格式,用于保存變量、矩陣、數組、結構體等數據類型。其名稱源于 “MATLAB Data” 的縮寫,最初設計為高效存儲和加載 MATLAB 環境中的數據,后來逐漸成為科學計算、工程分析等領域的通用數據格式之一。
(2).mat 格式的發展與版本演變
a.早期版本(.mat v4, v5)
v4 格式(MATLAB 4.0 之前):僅支持基本數據類型,采用 ASCII 或二進制存儲,結構簡單但功能有限。
v5 格式(MATLAB 5.0+,1997 年推出):引入二進制存儲標準,支持更復雜的數據類型(如細胞數組、對象),并采用分層結構存儲數據。
b.HDF5 格式(.mat v7.3 及以上,2006 年推出)
從 MATLAB 7.3(R2006b)開始,.mat 文件基于 HDF5(Hierarchical Data Format 5) 標準構建,支持存儲超過 2GB 的大數據集,兼容性和穩定性顯著提升。
(3).mat 文件的核心結構
a.數據組織方式
.mat 文件以鍵值對(Key-Value) 形式存儲數據,每個變量對應一個唯一的名稱(Key)和數據內容(Value)。
數據以分層結構組織,支持嵌套結構體(Struct)、細胞數組(Cell Array)等復雜數據類型。
b.HDF5 格式的技術特點
分層存儲:類似文件系統的目錄結構,可存儲多維數組、元數據、屬性等。
壓縮與分塊:支持數據壓縮(如 gzip)和分塊存儲,優化大數據集的讀寫效率。
跨平臺兼容性:HDF5 是國際通用標準,可在不同操作系統和軟件間共享數據。
(4)LMS Test.Lab 軟件也支持.mat導入文件。
2.matIo庫介紹
??a.matIo 是一個用于讀寫 MATLAB .mat 文件的開源 C 語言庫,旨在為非 MATLAB 環境提供高效、靈活的 .mat 文件處理能力。它支持讀取和寫入多種版本的 .mat 文件(包括 v4、v5 和基于 HDF5 的 v7.3 格式),使開發者能夠在 C/C++、Python、R 等語言中直接操作 .mat 數據,無需依賴 MATLAB 環境。
b.網址:https://github.com/tbeu/matio ?
??C.編譯:用qt工程直接打開zlib和matio工程中的CmakeList.txt文件即可直接編譯。
二..mat庫讀寫
1.使用matIo庫讀寫.mat文件
QT代碼示例:
#include <QCoreApplication>
#include <matio.h>
#include <QDebug>
void readMatFile(const QString &filename) {
????mat_t *mat = Mat_Open(filename.toLocal8Bit().data(), MAT_ACC_RDONLY);
????if (!mat) {
????????qWarning() << "無法打開文件:" << filename;
????????return;
????}
????matvar_t *var;
????while ((var = Mat_VarReadNextInfo(mat)) != nullptr) {
????????qDebug() << "找到變量:" << var->name << "類型:" << var->class_type;
????????if (var->class_type == MAT_C_DOUBLE && var->data_type == MAT_T_DOUBLE) {
????????????double *data = static_cast<double*>(var->data);
????????????qDebug() << "數據維度:" << var->dims[0] << "x" << var->dims[1];
????????????qDebug() << "示例數據:" << data[0] << data[1];
????????}
????????Mat_VarFree(var);
????}
????Mat_Close(mat);
}
void writeMatFile(const QString &filename) {
????mat_t *mat = Mat_CreateVer(filename.toLocal8Bit().data(), nullptr, MAT_FT_MAT5);
????if (!mat) {
????????qWarning() << "創建文件失敗";
????????return;
????}
????// 創建double矩陣
????double data[] = {1.0, 2.0, 3.0, 4.0};
????size_t dims[2] = {2, 2};
????matvar_t *matvar = Mat_VarCreate(
????????"matrix", MAT_C_DOUBLE, MAT_T_DOUBLE,
????????2, dims, data, MAT_F_DONT_COPY_DATA
????);
????Mat_VarWrite(mat, matvar, MAT_COMPRESSION_ZLIB);
????Mat_VarFree(matvar);
????// 創建字符串
????const char *str = "Hello from Qt6";
????matvar = Mat_VarCreate(
????????"message", MAT_C_CHAR, MAT_T_UTF8,
????????1, new size_t[1]{strlen(str)}, (void*)str, 0
????);
????Mat_VarWrite(mat, matvar, MAT_COMPRESSION_ZLIB);
????Mat_VarFree(matvar);
????Mat_Close(mat);
}
int main(int argc, char *argv[]) {
????QCoreApplication a(argc, argv);
????const QString filename = "demo.mat";
????// 寫入示例
????writeMatFile(filename);
????qDebug() << "文件寫入完成";
????// 讀取示例
????qDebug() << "\n讀取文件內容:";
????readMatFile(filename);
????return 0;
}
2.python讀寫.mat文件
需要使用 scipy.io 庫(需提前安裝 scipy):
python代碼:
import scipy.io as sio
# 讀取 .mat 文件
mat_data = sio.loadmat('data.mat')
# 保存為 .mat 文件
sio.savemat('output.mat', {'variable': data_array})