Matlab+Qt开发笔记(二):Qt打开mat文件显示读取的数据

简介: 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函数是获取非实体的头信息(可能提高了速度)。

解决

  




相关文章
|
3月前
【qt】如何读取文件并拆分信息?
【qt】如何读取文件并拆分信息?
33 0
|
3月前
|
监控 C++ 容器
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
88 0
|
2月前
|
开发工具 C++
qt开发技巧与三个问题点
本文介绍了三个Qt开发中的常见问题及其解决方法,并提供了一些实用的开发技巧。
|
2月前
|
3月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
142 2
|
3月前
Matlab批量修改指定文件下文件名
Matlab批量修改指定文件下文件名
176 1
Qt开发网络嗅探器02
Qt开发网络嗅探器02
|
3月前
|
存储 运维 监控
Qt开发网络嗅探器01
Qt开发网络嗅探器01
|
3月前
|
网络协议 容器
Qt开发网络嗅探器03
Qt开发网络嗅探器03
|
3月前
|
存储 算法 C++
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】

热门文章

最新文章