matio下载和编译
在编译一些库之前需要下载软件 Visual Studio 2022(其他版本也行)CMake编译工具
CMake:https://cmake.org/
正确编译matio库之前还需要编译2个库,下面有相关链接,一步步往下看。
HDF5库编译
hdf5官网:https://www.hdfgroup.org
网盘地址:链接:https://pan.baidu.com/s/1BSLTrto6pMguyymgOfzSCA?pwd=kmga
提取码:kmga
hdf5下载的是CMake版本,下载后选择对应版本bat文件运行。
会运行一段时间,耐心等待。
完成会自动退出,文件夹中会生成build文件夹使用vs打开sln文件。
先生成,生成后移动到INSTALL进行安装。
安装完成(生成截图略,以下为安装成功截图)。
注:在一个模式下进行生成和安装(编译后都选择同一模式进行)。
ZLIB库编译
zlib库:http://www.zlib.net/
我这里编译的是zlib -1.3.1,需要使用CMake编译。
在zlib文件夹中建立build文件夹,打开CMake选择路径。
配置完成后修改路径,在配置,然后生成。
完成后打开(vs打开)。
打开后生成并安装(我这里统一Release模式)。
此时,两个库都已编译成功。
matio库编译
推荐github:git clone https://github.com/tbeu/matio.git
建立build文件夹,使用CMake,然后配置。
配置后修改路径,注意Debug和Release,再去配置一下。
注:在matio-master中的bulid中有一个zip压缩包,要将压缩包解压
配置后在再次修改一下zlib库的路径。
配置,生成,vs打开文件。
在生成时可能遇到这种问题,这时候使用管理员模式打开vs。
管理员打开后生成安装。
matio库编译完成。
matio库使用
引入相关库文件,头文件
在你的工程文件夹中建立一个文件夹,文件夹中在建立三个文件夹。
bin中
include中
lib中
在建立一个pri文件,将这些文件路路径加入。
# 添加动态库
LIBS += -L$$PWD/libmatio_/bin -lhdf5 -llibmatio -lzlib
# 添加可执行文件
OTHER_FILES += $$PWD/libmatio_/bin/matdump
# 添加头文件
INCLUDEPATH += $$PWD/libmatio_/include
# 添加静态库
LIBS += -L$$PWD/libmatio_/lib -lhdf5 -llibhdf5 -llibmatio -lzlib
# message($$PWD/libmatio_/include) # 打印路径
编写代码使用
以下代码是读取mat文件中的矩阵。
bool MainWindow::openMatFile(QString filePath)
{
mat_t *pMatFile = 0; // MAT文件句柄
matvar_t *pMatVar = 0; // MAT文件中的变量
double *data = nullptr; // 存储矩阵数据的指针
int numRows, numCols; // 矩阵的行数和列数
// 打开mat文件
pMatFile = Mat_Open(filePath.toUtf8().data(), MAT_ACC_RDONLY); // matOpen 函数打开MAT文件
if(!pMatFile)
{
qDebug() << "Failed to MAT file";
return false;
}
QString varName;
// 遍历所有变量
pMatVar = Mat_VarReadNext(pMatFile);
while (pMatVar)
{
// 输出变量信息
qDebug() << "pMatVar->name: " << pMatVar->name; // 变量名称
qDebug() << "pMatVar->rank: " << pMatVar->rank; // 变量维度
// pMatVar->dims 存储各维度变量的行数列数 pMatVar->rank = 2 则是矩阵
// pMatVar->class_type 表示变量的数据类型分类
// pMatVar->data_type 实际存储的数据类型
// pMatVar->isComplex 变量的数据是否包含复数部分
// pMatVar->isLogical 指示变量的数据是否为逻辑类型(布尔值)
// pMatVar->isGlobal 指示变量是否为全局变量
// 处理二维双精度矩阵
if (pMatVar->class_type == MAT_C_DOUBLE && pMatVar->rank == 2)
{
numRows = pMatVar->dims[0];
numCols = pMatVar->dims[1];
data = static_cast<double*>(pMatVar->data);
// 将数据复制到Eigen矩阵
Eigen::MatrixXd eigenMatrix(numRows, numCols);
int i = 0;
for (int c = 0; c < numCols; ++c)
{
for (int r = 0; r < numRows; ++r)
{
eigenMatrix(r, c) = data[i];
++i;
}
}
qDebug() << "读取到的矩阵 " << pMatVar->name;
qDebug() << eigenMatrix(0,0) << eigenMatrix(0,1) << eigenMatrix(0,2);
qDebug() << eigenMatrix(0,0) << eigenMatrix(1,0) << eigenMatrix(2,0);
}
else
{
}
// 释放当前变量
Mat_VarFree(pMatVar);
pMatVar = nullptr;
// 继续遍历下一个变量
pMatVar = Mat_VarReadNext(pMatFile);
}
// 关闭mat文件
Mat_Close(pMatFile);
pMatFile = 0;
qDebug() << "file Close";
return true;
}
原创链接:zlib开发笔记(四):zlib库介绍、编译windows vs2015x64版本和工程模板_zlib.libx64-CSDN博客