一、简述
分享一下在Qt使用matlab库进行一些操作,至于什么是matlab,百度一下,你就知道。matlab中有很多写好的库函数可以方便使用,想使用matlab自己的数据文件.mat文件也需要引用matlab的相关库函数。
具体有两种用法:
- 1、在matlab中写好相关函数,发布为dll供Qt使用
- 2、直接在Qt中使用matlab库函数
两种方法都有各自优缺点,其一因为在matlab软件中直接编写,可方便看到参相关数,运行结果,还可以直接看到生成数据的相关曲线图。但是只能运行已经写好的dll,修改代码不方便。
其二在Qt中直接调用,也算是非常方便,想怎么用就直接写就行了,下面中我会分享一个利用matlab库对它的.mat数据文件进行读和写的例子,但是.mat文件呢,一般编辑器是打不开的,要想看到具体的数据,是否写的对不对啊,读取的对不对啊还是得用matlab软件打开进行查看。
大家可以针对自己的需求自行选择操作方式。今天先讲述一下在Qt中如何直接使用matlab库进行读、写的操作。
二、代码之路
- 第一步:下载matlab软件
可以去官网进行下载,然后进行安装,装完在网上找破解软件即可使用(或者先试用一个月)。安装完毕之后会在系统环境变量Path中添加以下路径,但是真正依赖的dll文件都在 F:\Program Files\MATLAB\R2018b\bin\win64 目录。
- ** 第二步:新建工程,配置matlab环境**
注 : 以下为VS下配置的环境示例,QCreator直接在pro文件中安照下面步骤添加相关代码进行引用。
(1)、配置引用头文件目录
(2)、配置相关依赖库函数配置库目录
配置引用的库,这里只需用到读写操作,所有只需要libmat.lib以及libmx.lib即可。
(3)、代码之路
保存mat文件
void TestMatlabLib::saveMatFile()
{
double *out = new double[50];
for (int i = 0; i < 50; i++)
{
// 生成随机数;
QTime time;
time = QTime::currentTime();
qsrand(time.msec() * 1000);
QThread::msleep(2);
out[i] = qrand() % 1000;
}
MATFile *OutFile = NULL;
mxArray *pMxArray = NULL;
// 打开mat文件;
// 如果文件不存在,则创建一个空文件;
OutFile = matOpen(QString("data.mat").toLatin1(), "w");
// 创建 5*10 的矩阵数据;(mat文件数据是 X * X 的 矩阵);
pMxArray = mxCreateDoubleMatrix(5, 10, mxREAL);
// 数据内存拷贝;
memcpy((void *)(mxGetPr(pMxArray)), (void *)out, sizeof(double) * 50);
// 将矩阵数据存入到mat文件中;
matPutVariable(OutFile, "var", pMxArray);
// 关闭文件;
matClose(OutFile);
}
// 写数据到mat文件
// 打开mat文件;
MATFile *pmatFile = matOpen(QString("data.mat").toLatin1(), "r");
if (pmatFile == NULL)
{
return;
}
// 获取文件中变量var;
mxArray* Array1 = matGetVariable(pmatFile, "var");
matClose(pmatFile);
// 获取矩阵数据行数;
int row = mxGetM(Array1);
// 获取矩阵数据列数;
int column = mxGetN(Array1);
// 获取数据;
double *Data = (double*)mxGetData(Array1);
for (int i = 0; i < row * column; i++)
{
qDebug() << Data[i];
}
保存文件,我们可以用matlab软件打开,以下是调用saveMatFile函数生成的mat文件。
注意:mat文件中的数据存储是一列一列存储的。
尾
以上讲述了Qt中使用matlab库读取/存储 .mat文件。
有人可能会问,matlab这么大,可不可以不安装啊,可以,需要两步,一是把需要的头文件和lib文件放到自己的工程目录下, 然后引用该工程下的相关文件,第二把相关dll拷贝到生成的exe同级目录即可。