libmatio开发笔记(一):matlab文件操作libmatio库介绍,编译和基础Demo
前言
Qt可通过matlab的库对mat文件进行读写,第三方库matio也可以对mat文件进行读写,其已经支持mat文件的7.3版本。
libmatio库介绍
matio软件包含一个用于读写MATLAB MAT fles的库。libmatio库是创建/打开MAT fles和写入的主要接口。
matio库可以编写版本5的MAT fles,版本5的fles带有可变压缩(如果使用zlib构建),以及支持引入的HDF5格式MAT file,即MATLAB 7.3版。
下载
Git地址:git clone https://github.com/tbeu/matio.git
官网:https://www.hdfgroup.org
QQ群:1047134658(点击“文件”搜索“matio”,群内与博文同步更新)
Window上编译(从源码使用VS工程直接编译)
编译环境:VS2015(vs14版本)。
步骤一:下载解压

步骤二:打开源码工程
使用VS2015打开库中间的matio.sln(此处笔者是VS2017装了VS2015的MSVC编译器),如下图:



修改编译器版本

步骤三:编译libmatio,出现无法打开”zlib.h”解决
开始编译,出现错误如下:

需要编译zlib库的x64版本,请参照博文《zlib开发笔记(四):zlib库介绍、编译windows vs2015x64版本和工程模板》。
将zlib头文件和库引入到libmatio工程中。
头文件路径:

库文件路径:

库引入:

意味着还缺少hdf5文件,还需要添加hdf5的msvc2015x64版本,暂时先不管,本步骤解决zlib问题,继续编译。
步骤四:编译libmatio,出现无法打开”hdf5.h”,解决
编译hdf5,请参考文章:《Hdf5开发笔记(一):hdf5介绍,在windows上编译msvc2015x64版本》


发现不行,重新打开定位安装文件:



解决后,继续编译。
步骤五:编译libmatio,调用参数太少

打架,只剩下可能是2个库的升级依赖导致的问题,matio不兼容hdf5的三个大版本的api。
步骤五:更换hdf5版本
重新定义版本,Matio:1.5.12(与之前一样),Hdf5:1.8.22(前面使用的是1.12.x),即更换hd5的版本即可。
hdf5的编译,请参照博文《Hdf5开发笔记(一):hdf5介绍,编译和基础模板Demo》
然后更改包含的路径:


至此,此种方法编译失败,其库的参数调用几个版本的函数调用都没有这个,摸索后基本放弃,只能另寻他法。
Window上编译(CMake方式编译)
编译环境:VS2015(vs14版本)。
步骤一:下载解压
直接git的

步骤二:CMake配置


编译hdf5,请参考文章:《Hdf5开发笔记(一):hdf5介绍,在windows上编译msvc2015x64版本》
添加HDF5的路径,如下图:

zlib编译,请参照博文《zlib开发笔记(四):zlib库介绍、编译windows vs2015x64版本和工程模板》。
添加zib,如下图:

添加zlib的路径,如下图:

配置通过:

步骤三:生成工程

步骤四:打开工程

步骤五:工程生成
打开工程后,编译

步骤六:安装

模块化

Demo
bool MatlabManager::openMatFile(QString filePath)
{
mat_t *pMatFile = 0;
matvar_t *pMatVar = 0;
// 打开mat文件
pMatFile = Mat_Open(filePath.toUtf8().data(), MAT_ACC_RDONLY);
if(!pMatFile)
{
LOG << "Failed to Mat_Open(filePath.toUtf8().data(), MAT_ACC_RDONLY)";
return false;
}
// 遍历所有变量
pMatVar = Mat_VarReadNext(pMatFile);
while(pMatVar)
{
LOG << "read variable ============================="
<< "pMatVar->name:" << pMatVar->name << endl
<< "pMatVar->rank:" << pMatVar->rank << endl
<< "pMatVar->dims:" << pMatVar->dims << endl
<< "pMatVar->class_type:" << pMatVar->class_type << endl
<< "pMatVar->data_type:" << pMatVar->data_type << endl
<< "pMatVar->isComplex:" << pMatVar->isComplex << endl
<< "pMatVar->isLogical:" << pMatVar->isLogical << endl
<< "pMatVar->isGlobal:" << pMatVar->isGlobal << endl;
// 释放
Mat_VarFree(pMatVar);
pMatVar = 0;
// 继续遍历
pMatVar = Mat_VarReadNextInfo(pMatFile);
}
// 关闭mat文件
Mat_Close(pMatFile);
pMatFile = 0;
return true;
}
Demo测试
double数据类型


struct+doubleSeries类型
先解析的是struct

doubleSeries数据类型

查看文档也只支持这几种类型特殊文件

doubleSeries是不支持的
工程模板
testMatioDemo_工程模板_v1.0.0_基础调用matio库成功遍历文件.rar
libmatio开发笔记(一):matlab文件操作libmatio库介绍,编译和基础Demo的更多相关文章
- libzip开发笔记(二):libzip库介绍、ubuntu平台编译和工程模板
前言 Qt使用一些压缩解压功能,选择libzip库,libzip库比较原始,也是很多其他库的基础支撑库,编译过了windows版本,有需求编译一个ubuntu版本的,交叉编译需求的同样可参照本文章 ...
- zlib开发笔记(三):zlib库介绍、在ubuntu上进行arm平台交叉编译
前言 方便做嵌入式arm的交叉移植zlib库. Zlib库 zlib被设计为一个免费的,通用的,法律上不受限制的-即不受任何专利保护的无损数据压缩库,几乎可以在任何计算机硬件和操作系统上使 ...
- zlib开发笔记(四):zlib库介绍、编译windows vs2015x64版本和工程模板
前言 Qt使用一些压缩解压功能,介绍过libzip库编译,本篇说明zlib库.需要用到zlib的msvc2015x64版本,编译一下. 版本编译引导 zlib在windows上的mingw32 ...
- Qwt开发笔记(一):Qwt简介、下载以及基础demo工程模板
前言 QWT开发笔记系列整理集合,这是目前使用最为广泛的Qt图表类(Qt的QWidget代码方向只有QtCharts,Qwt,QCustomPlot),使用多年,系统性的整理,本系列旨在系统解说并 ...
- libzip开发笔记(一):libzip库介绍、编译和工程模板
前言 Qt使用一些压缩解压功能,选择libzip库,libzip库比较原始,也是很多其他库的基础支撑库. libzip libzip是一个C库,用于读取,创建和修改zip档案.可以从数 ...
- 《Windows内核安全与驱动开发》4.1 文件操作
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发>4.1 文件操作 从 C:\a.txt 中读取一部分内容并利用 DbgPrin ...
- Matlab文件操作
1. Matlab文件操作主要有三个步骤:首先打开文件,然后对文件进行读写操作,最后要关闭文件. 2. fid=fopen(文件名,打开方式) 'r' 只读,文件必须存在(缺省的打开方式) 'w' ...
- Windows phone 8 学习笔记(2) 数据文件操作
原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...
- (Unity)XML文件读写与IO文件操作类使用介绍
using System.Xml; //xml文件操作命名空间 #region 写入操作 void WriteXMLFile(string _fileName) { Xm ...
- matlab文件操作及读txt文件(fopen,fseek,fread,fclose)
文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件.MATLAB提供了一系列低层输入输出函数,专门用于文件操作. 1.文件的打开与关闭 1)打开文件 在读写文件之前,必须先用f ...
随机推荐
- 【转帖】一篇文章让你了解灾备指标:RPO与RTO
RTO 和 RPO 都是企业灾难恢复(Disaster Recovery, DR)需要考虑的关键指标,这两个指标可以用来指导企业来制定合适的业务系统服务或数据的恢复方案. RPO(Recovery P ...
- Oracle 设置白名单过滤
最近有一个需求 要求开发人员不能随便连接测试的数据库 又不想太过复杂,部分人还得进行连结. 查了下往上是有方案的: 就是 TCP_VALIDNODE_CHECKING 参数 解决方法和说明如下 来源 ...
- 通过mat获取OOM时对象信息的方法与过程
通过mat获取OOM时对象信息的方法与过程 背景 如果谁的耐心不好, 就让他去看MAT里的objects信息. 有项目出现了OOM的情况 我在公司这边有一台内存比较高的Win10机器. 然后帮助同事进 ...
- Chrome 下载地址
今天同事找到一个网页 感觉非常好用 这里保存并且推荐一下 https://www.chromedownloads.net/chrome64win-stable/
- TypeScript 类型增强declare的使用
类型增强 declare 的使用 1.如果一个有一个全局变量 golabaol . 在index.html中. 2.我们在xx.vue中使用 golabaol .这个时候会报错 找不到名称" ...
- vue3关于.sync的用法
场景描述 我们都知道,子组件是不能够去修改父组件传递过来的数据. 因为如果子组件去修改父组件件传递过来的数据. 会导致数据的应用流向变得难以理解. 但是有些时候,我们需要当子组件的数据变化后,父组件的 ...
- elementui出现展开后子菜单宽度多出1px问题
添加 就可以解决了 .el-menu { border-right-width: 0; } <template> <div class="compen-left-men&q ...
- 【解决了一个小问题】terraform创建service后,如何获取VIP的值?
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 创建一个pod后,再为这个pod创建一个对应的servic ...
- Docker 安装 MySQL8 数据库
创建数据卷 mkdir -p /usr/mysql/conf /usr/mysql/data chmod -R 755 /usr/mysql/ 创建配置文件 vim /usr/mysql/conf/m ...
- socket编程 [补档-2023-07-10]
Linux网络编程 1.socket编程 socket是一种通信机制,用于在网络中不同计算机之间进行数据传输,当然也可用用于进程间通信.在linux中,有文件描述符这么个东西,我们可以通过socket ...