Matlab+Qt开发笔记(二):Qt打开mat文件显示读取的数据
前言
介绍了基础环境,最终是为了读取显示.mat文件,本篇读取mat文件并显示。
补充
测试的mat文件是double类型的。
Matlab库数据类型
变量类型:matError,错误变量
错误类型,实际上是整形。
变量类型:MATFile,mat文件指针
打开mat文件返回的指针,操作文件需要一直使用,直至关闭。
变量类型:mxArray,mat数组
打开mat文件所产生的二维数组类型。
Matlab库函数打开读取需要用到的
实际整理了一些函数,但是实际本篇只列出了本篇需要用到的函数(用“*”号标记)
*函数:matOpen,打开mat文件
MAT_API MATFile* matOpen(const char *filename, const char * mode);
使用“模式”打开MAT文件“文件名”。回来指向MAT文件的指针,用于其他MAT API函数。
当前支持的模式:
- “r” – 只读
- “w” – 只写(删除已经存在的文件)
- “w4” – 跟"w"一样,但是创建MATLAB 4.0 MAT文件
- “w7.3” – 跟"w",一样,但是创建MATLAB 7.3 MAT文件.
- “u” – 更新文件,允许读写,不删除现有文件
函数:matGetDir,获取组名称的列表
char ** matGetDir(MATFile * pMF, int *num);
获取MAT文件中数组名称的列表。此函数返回的字符串数组包含“num”项。它是通过一次对mxCalloc的调用分配的,因此可以(必须)通过一次对mxFree的调用来释放它。
*函数:matGetNextVariable,获取下一个变量数组
mxArray * matGetNextVariable(MATFile *pMF, const char **nameptr);
从MAT文件pMF的当前文件位置读取下一个数组值。此功能只能与matOpen和matClose一起使用。将pMF传递给任何其他API函数将导致matGetNextVariable()无法正常工作。
特别注意:轮询变量表,那么直接第二个参数传入0。
函数:matGetNextVariableInfo,获取下一个变量数组
mxArray * matGetNextVariableInfo(MATFile *pMF, const char **nameptr);
读取MAT文件中下一个数组值的数组头。此功能只能与matOpen和matClose一起使用。将pMF传递给任何其他API函数将导致matGetNextVariableInfo无法正常工作。
有关定义,请参见matGetVariableInfo()的说明以及数组头的有效使用。
注意:此函数与matGetNextVariable一样,但是无法通过mxGetPtr获取实体)。
函数:matGetVariable,获取指定名称的变量数组
`mxArray * matGetVariable(MATFile * pMF, const char * name);
从MAT文件中读取指定变量名的数组值,返回0则出错。
函数:matGetVariableInfo,获取指定名称的变量数组
  mxArray * matGetVariableInfo(MATFile *pMF, const char * name);
从MAT文件中读取具有指定名称的变量的数组头。
数组头包含与数组相同的所有信息,只是pr、pi、ir和jc数据结构没有分配给非递归数据类型。也就是说,单元格、结构和对象包含指向其他数组头的指针,但数字、字符串和稀疏数组的pr、pi、ir或jc字段中不包含有效数据。
数组头的用途是在不读取数组的所有实际数据的情况下快速访问有关数组的信息。因此,诸如mxGetM、mxGetN和mxGetClassID之类的函数可以与数组头一起使用,但mxGetPr、mxGetPi、mxGetIr、mxGetJc、mxSetPr、mxSetPi、mxSetIr和mxSetJc不能。数组头不应返回到MATLAB(例如通过MEX API)或任何其他需要完整mxArray的非矩阵访问API函数(例如engPutVariable()、matPutVariable()和mexPutVariable())。
注意:此函数与matGetVariable一样,但是无法通过mxGetPtr获取实体)。
*函数:mxGetM,获取行数
size_t mxGetM(const mxArray *pa);
*函数:mxGetN,获取列数
size_t mxGetN(const mxArray *pa);
*函数:double * mxGetPr,获取mxArray的实体指针
double *mxGetPr(const mxArray *pa);
(PS:数据存储是一列一列存储的)
*函数:matClose,关闭mat文件
matError matClose(MATFile *pMF);
关闭使用matOpen打开的MAT文件。matClose返回后,MATfile参数的指针无效。成功返回零,错误返回EOF。
Mat文件验证

Demo
bool MatlabManager::openMatFile(QString filePath)
{
MATFile *pMATFile = 0;
pMATFile = matOpen(filePath.toUtf8().data(), "r");
if(!pMATFile)
{
LOG << "Failed to matOpen:" << filePath;
QMessageBox::information(0, "Failed", QString("Failed to open file:%1").arg(filePath));
return false;
}
// QMessageBox::information(0, "Succeed", QString("Succeed to open file:%1").arg(filePath));
char **namePtr = 0;
// 获取第一个变量名和
mxArray *pMxArray = matGetNextVariable(pMATFile, 0);
// mxArray *pMxArray = matGetNextVariableInfo(pMATFile, 0);
LOG;
if(!pMxArray)
{
QMessageBox::information(0, "Failed", QString("Failed to matGetNextVariableInfo"));
return false;
}
// QMessageBox::information(0, "Succeed", QString("Succeed to matGetNextVariableInfo"));
LOG;
// 获取行数和列数
int rows = mxGetM(pMxArray);
int cols = mxGetN(pMxArray);
// QMessageBox::information(0, "Succeed", QString("Succeed to get row:%1 col:%2").arg(rows).arg(cols));
LOG << "read rows:" << rows << ", cols:" << cols;
// 获取指针地址
double *pData;
pData = mxGetPr(pMxArray);
// 显示
for(int col = 0; col < cols; col++)
{
QString str;
for(int row = 0; row < rows; row++)
{
str += QString("%1").arg((double)(pData[col * rows + row])) + ",";
}
LOG << str;
}
LOG;
// 关闭文件
matClose(pMATFile);
LOG << pMATFile;
pMATFile = 0;
LOG << pMATFile;
}
Demo演示



读取出值:

可看出,值是竖着读的,这里的行为6行,10列:

实际读取顺序如下:
优化代码矫正后:

工程模板:v1.1.0
testMatlabDemo_工程模板_v1.1.0_读取matlab文件并打印数据.rar
入坑
入坑一:进入matlab主界面货不对板
问题
安装完成后,只有一个图标,如下:

打开则进入工程界面(实际只是matlab内的一个小工具):

原因
未知
解决
进去matlab安装目录bin下,直接打开matlab.exe,读matlab主界面后,不会马上出来,多点几次等等(几分钟),会出来如下图,这才是matlab主界面:

入坑二:获取mxArray,获取其指针打印宕机
问题
获取mxGetPtr获取的为0x00。
原因
获取mxArray的时候,使用的是matGetNextVariableInfo函数,实际需要获取值则需要matGetNextVariable函数,matGetNextVariableInfo函数是获取非实体的头信息(可能提高了速度)。
解决

Matlab+Qt开发笔记(二):Qt打开mat文件显示读取的数据的更多相关文章
- Matlab+Qt开发笔记(一):matlab搭建Qt开发matlib环境以及Demo测试
前言 做一些数据处理软件,使用matlab文件,.mat文件. 准备条件 安装matlab2016,发现是vs 12(是vs2011版本),Qt5.9.3是支持vs 14(是vs2015版 ...
- 【Qt开发】关于Qt应用程序中的堆栈、静态存储区的使用错误
[Qt开发]关于Qt应用程序中的堆栈.静态存储区的使用错误 标签:[Qt开发] 最近终于又碰到了这个问题,想在main函数中定义一个局部大的数组,结果运行就报错,尼玛!刚开始真的不知道到发生了什么,后 ...
- Django开发笔记二
Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.xadmin添加主题.修改标题页脚和收起左侧菜单 # ...
- 【Qt开发】设置Qt应用程序图标
[Qt开发]设置Qt应用程序图标 标签:[Qt开发] 首先,准备一个图标,例如:zx.ico,并新建一个文本文档,在里面添加一行: IDI_ICON1 ICON DISCARDABLE"zx ...
- 【Qt开发】解决Qt5.7.0中文显示乱码的问题
[Qt开发]解决Qt5.7.0中文显示乱码的问题 亲测可用: 乱码主要是编码格式的问题,这里可以通过Edit菜单中选择当前文档的编码方式,选择按照UTF-8格式保存,然后输入对应的中文,保存,然后运行 ...
- C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件
原文:C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件 这两天忙着把框架改为支持加载C++和Delphi的插件,来不及更新blog了. 原来的写的框架只支持c#插件,这个好做 ...
- web打开本地文件并读取内容
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- SDL开发笔记(二):音频基础介绍、使用SDL播放音频
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- 【Linux开发】【Qt开发】ARM QT移植详细步骤教程
ARM QT移植详细步骤教程 米尔SAM9X5和A5D3X上默认的Qt版本是4.5.3,当这个版本的Qt库不能满足实际开发需求时,可通过此方法制定Qt开发.运行环境. 移植的步骤如下: 1.下载新版q ...
随机推荐
- 鸿蒙内核源码分析(编译脚本篇) | 如何防编译环境中的牛皮癣 | 百篇博客分析OpenHarmony源码 | v58.01
百篇博客系列篇.本篇为: v58.xx 鸿蒙内核源码分析(环境脚本篇) | 编译鸿蒙原来如此简单 | 51.c.h.o 本篇用两个脚本完成鸿蒙(L1)的编译环境安装/源码下载/编译过程,让编译,调试鸿 ...
- P4780-Phi的反函数【dfs】
正题 题目链接:https://www.luogu.com.cn/problem/P4780 题目大意 给出\(n\),求一个最小的\(x\)满足\(\varphi(x)=n\). 若不存在或者大于\ ...
- Douban Top 250爬虫
# Ref: https://fishc.com.cn/forum.php?mod=viewthread&tid=101887&extra=page%3D1%26filter%3Dty ...
- 测试开发【提测平台】分享12-掌握日期组件&列表状态格式化最终实现提测管理多条件搜索展示功能
微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 本章内容思维导图如下,由于需要各种状态下的菜单操作,所以需要先实现提测信息的列表基础页面,然后再推进其他需求开发 基本知识点学习 Date ...
- 浅析InnoDB引擎的索引和索引原理
浅析InnoDB引擎的索引和索引原理 什么是InnoDB的索引 InnoDB的索引就是一颗B+树.页是InnoDB引擎在内存和磁盘之间交换数据的基本单位,页的大小一般是16KB,页的大小可以在启动My ...
- 常用的SQL查询思维/场景
前言 现在大多数开发工作中,已经可以使用一些组件或框架提供的强大的条件构造器来完成查询数据了,虽然强大而且方便,但也还是存在很多业务场景需要实打实的编写传统SQL语句.特别一些测试.维护.问题排查的时 ...
- 【实验向】问题:假设计算机A和计算机B通信,计算机A给计算机B发送一串16个字节的二进制字节串,以数组形式表示:
问题: 假设计算机A和计算机B通信,计算机A给计算机B发送一串16个字节的二进制字节串,以数组形式表示: unsigned char[16] = {0x3f, 0xa0, 0x00, 0x00, 0x ...
- SpringBoot 01 hello world 01
hello world项目结构: pom中配置的依赖相当于spring boot的可安装插件,需要下载的依赖直接在里边配置. 目前用到的每个注解: 1.主程序中 @SpringBootApplicat ...
- 【UE4 C++】获取运行时间、设置时间流速、暂停游戏
基于UGameplayStatics 获取运行时间 /** Returns the frame delta time in seconds, adjusted by time dilation. */ ...
- [对对子队]会议记录5.20(Scrum Meeting7)
今天已完成的工作 马嘉 工作内容:录制新手引导视频 相关issue:优化顺序关卡新手引导功能 相关签入:feat: 录制了新的新手引导视频 吴昭邦 工作内容:增加加速功能 相关is ...