全网最全,从安装环境和配置环境变量(配置环境变量是大坑),然后再到需要的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=
完结撒花~~