C++(Qt)读取.mat文件(可以读取多级变量)

全网最全,从安装环境和配置环境变量(配置环境变量是大坑),然后再到需要的SDK库,再到代码详细解读。

首先就是需要安装matlab,注意:你使用的编译器版本需要和MATLAB版本相互兼容!!
官网可以查看是否兼容
https://www.mathworks.com/support/requirements/supported-compilers.html
然后下载完成后,需要在编辑环境变量添加环境
![在在这里插入图片描述
然后加上这你自己MATLAB的bin\win64的path(因为我编译器是MSVC版本,具体需要看你的编译器,可能是minGW或者其他)
在这里插入图片描述
然后接下去我们就可以从MATLAB找我们需要的SDK
Include头文件
在这里插入图片描述
lib和dll
在这里插入图片描述
Demo
前面配置好后,可以直接在main函数运行

#include <QCoreApplication>
#include <QDebug>
#include "mat.h"

void processStructVar(mxArray *structVar);

void processCellVar(mxArray *cellVar);

void processNumericVar(mxArray *numericVar);

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 打开MATLAB MAT-file
    MATFile *pmat = matOpen("data.mat", "r");
    if (pmat == NULL) {
        qDebug() << "Error opening file data.mat";
        return 1;
    }

    // 读取MAT-file中的变量
    mxArray *var = NULL;
    while ((var = matGetNextVariable(pmat, NULL)) != NULL) {
        if (mxIsStruct(var)) {
            processStructVar(var);
        } else if (mxIsCell(var)) {
            processCellVar(var);
        } else if (mxIsNumeric(var)) {
            processNumericVar(var);
        }

        mxDestroyArray(var);
    }

    // 关闭MAT-file
    matClose(pmat);

    return a.exec();
}

void processStructVar(mxArray *structVar)
{
    // 遍历结构体字段
    int numFields = mxGetNumberOfFields(structVar);
    for (int i = 0; i < numFields; i++) {
        const char *fieldName = mxGetFieldNameByNumber(structVar, i);
        mxArray *fieldVar = mxGetField(structVar, 0, fieldName);

        // 输出结构体字段名称和数据
        qDebug() << "Field Name: " << fieldName;
        if (mxIsStruct(fieldVar)) {
            processStructVar(fieldVar);
        } else if (mxIsCell(fieldVar)) {
            processCellVar(fieldVar);
        } else if (mxIsNumeric(fieldVar)) {
            processNumericVar(fieldVar);
        }

        //mxDestroyArray(fieldVar);  前面释放过着就不需要释放,否则程序会崩溃
    }
}

void processCellVar(mxArray *cellVar)
{
    // 遍历cell数组元素
    int numElems = mxGetNumberOfElements(cellVar);
    for (int i = 0; i < numElems; i++) {
        mxArray *cellElem = mxGetCell(cellVar, i);

        // 输出cell数组元素数据
        if (mxIsStruct(cellElem)) {
            processStructVar(cellElem);
        } else if (mxIsCell(cellElem)) {
            processCellVar(cellElem);
        } else if (mxIsNumeric(cellElem)) {
            processNumericVar(cellElem);
        }

        mxDestroyArray(cellElem);
    }
}

void processNumericVar(mxArray *numericVar)
{
    // 输出数值数据
    double *data = mxGetPr(numericVar);
	int numRows = mxGetM(numericVar);
	int numCols = mxGetN(numericVar);
	qDebug() << "Numeric Data: ";
	for (int i = 0; i < numRows; i++) {
	    for (int j = 0; j < numCols; j++) {
	        qDebug() << data[i * numCols + j];
	    }
	}
}

接下来说一下这段代码的几个重点函数:

  • matOpen:
    该函数用于打开一个MATLAB MAT-file,接受两个参数,第一个参数是MAT-file的文件名,第二个参数是文件的打开模式("r"表示只读)。

  • matGetNextVariable:
    该函数用于逐个读取MAT-file中的变量。通过循环调用该函数,可以逐个获取MAT-file中的变量。第一个参数是MAT-file的指针,第二个参数是用于存储变量名称的指针,传入NULL表示从第一个变量开始读取,函数返回下一个变量的指针。

  • mxIsStruct:
    该函数用于判断一个mxArray是否为结构体类型。

  • mxIsCell:
    该函数用于判断一个mxArray是否为cell数组类型。

  • mxIsNumeric:该函数用于判断一个mxArray是否为数值类型(例如double、int等)。

  • mxGetNumberOfFields: 该函数用于获取结构体类型的mxArray中的字段数目。

  • mxGetFieldNameByNumber: 该函数用于根据字段编号获取结构体类型的mxArray中的字段名称。

  • mxGetField: 该函数用于获取结构体类型的mxArray中指定字段的值。

  • mxGetNumberOfElements: 该函数用于获取cell数组类型的mxArray中的元素个数。

  • mxGetCell: 该函数用于获取cell数组类型的mxArray中指定索引位置的元素。

  • mxGetPr: 该函数用于获取数值类型的mxArray中的数据指针。

  • mxDestroyArray: 该函数用于销毁一个mxArray对象,释放内存空间。

可以根据MATLAB的官方文档API,链接如下
https://ww2.mathworks.cn/support/search.html?q=matopen&submitsearch=
在这里插入图片描述
完结撒花~~
在这里插入图片描述

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值