一. 内容简介
QT调用matlab程序,首先会卡一下,第二次就不会卡了,就针对这个情况做一下,QT调用matlab程序所需时间的测试。
二. 软件环境
2.1QT 5.14.1
新版QT6.4,,6.5在线安装经常失败,而5.9版本又无法编译64位程序,所以就采用5.14.1这个用的比较多也比较稳定的一个版本。
QT编译器采用的是MSVC2017 64bit。
链接:https://pan.baidu.com/s/1ER98DPAkTUPlIyCC6osNNQ?pwd=1234
2.2 MatlabR2022b(64位)
2.3 Visual studio 2017
Visual stdio采用2017主要是因为QT5.14.1最高到MSVC2017 64bit。
2.4 测试代码
链接:https://pan.baidu.com/s/1tNBFa4OCE5ORUuhRCOvhpg?pwd=1234
三.主要流程
3.1 用matlab生成三个lib库,并且添入项目里面
3.2 页面说明
3.3 测试过程以及结果分析
3.4 处理办法
四.具体步骤
4.1 用matlab生成三个lib库,并且添入项目里面
matlab文件创了三个,分别是ceshi1,ceshi2,cheshi3,代码如下
//cheshi1
function [C]= matAdd(A,B)
C=A+B;
end
//cheshi2
function [C]= matAdd2(A,B)
C=A+B;
end
//cheshi3
function [C]= matAdd2(A,B)
C=A+B+B;
end
具体的过程生成的库过程,参考(https://blog.csdn.net/qq_45179361/article/details/128098901),然后导入完成。
4.2 页面说明
点击按钮就会调用matlab代码进行计算,将值输出到计算数值那边,每个按钮按下以后,计算数值会显示出计算结果,按钮后边的label会显示出计算时间,四个按钮的代码如下。
void MainWindow::on_pushButton_clicked()
{
QTime time;
QDateTime n=QDateTime::currentDateTime();
time.start();
ceshiInitialize();//DLL 初始化
QString result;
double para1,para2;
para1=ui->lineEdit_1->text().toDouble();
para2=ui->lineEdit_2->text().toDouble();
mwArray a(1,1,mxDOUBLE_CLASS);
mwArray b(1,1,mxDOUBLE_CLASS);
mwArray c(1,1,mxDOUBLE_CLASS);
a(1,1)=para1;
b(1,1)=para2;
int nargout=1;//输出变量个数
ceshi(nargout,c,a,b);//C=A+B
result=c.ToString();
ui->label->setText(result);
QDateTime now = QDateTime::currentDateTime();
QString s = QString(tr("%1")).arg(time.elapsed());
ui->label_2->setText(s);
}
void MainWindow::on_pushButton_2_clicked()
{
QTime time;
QDateTime n=QDateTime::currentDateTime();
time.start();
ceshiInitialize(); //DLL 初始化
QString result;
double para1,para2;
para1=ui->lineEdit_1->text().toDouble();
para2=ui->lineEdit_2->text().toDouble();
mwArray a(1,1,mxDOUBLE_CLASS);
mwArray b(1,1,mxDOUBLE_CLASS);
mwArray c(1,1,mxDOUBLE_CLASS);
a(1,1)=para1;
b(1,1)=para2;
int nargout=1;//输出变量个数
ceshi(nargout,c,a,b);//C=A+B
result=c.ToString();
ui->label->setText(result);
QDateTime now = QDateTime::currentDateTime();
QString s = QString(tr("%1")).arg(time.elapsed());
ui->label_3->setText(s);
}
void MainWindow::on_pushButton_3_clicked()
{
QTime time;
time.start();
QDateTime n=QDateTime::currentDateTime();
ceshi2Initialize();//DLL 初始化
QString result;
double para1,para2;
para1=ui->lineEdit_1->text().toDouble();
para2=ui->lineEdit_2->text().toDouble();
mwArray a(1,1,mxDOUBLE_CLASS);
mwArray b(1,1,mxDOUBLE_CLASS);
mwArray c(1,1,mxDOUBLE_CLASS);
a(1,1)=para1;
b(1,1)=para2;
int nargout=1;//输出变量个数
ceshi2(nargout,c,a,b);//C=A+B
result=c.ToString();
ui->label->setText(result);
QDateTime now = QDateTime::currentDateTime();
QString s = QString(tr("%1")).arg(time.elapsed());
ui->label_4->setText(s);
}
void MainWindow::on_pushButton_4_clicked()
{
QTime time;
time.start();
QDateTime n=QDateTime::currentDateTime();
ceshi3Initialize(); //DLL 初始化
QString result;
double para1,para2;
para1=ui->lineEdit_1->text().toDouble();
para2=ui->lineEdit_2->text().toDouble();
mwArray a(1,1,mxDOUBLE_CLASS);
mwArray b(1,1,mxDOUBLE_CLASS);
mwArray c(1,1,mxDOUBLE_CLASS);
a(1,1)=para1;
b(1,1)=para2;
int nargout=1;//输出变量个数
ceshi3(nargout,c,a,b);//C=A+B
result=c.ToString();
ui->label->setText(result);
QDateTime now = QDateTime::currentDateTime();
QString s = QString(tr("%1")).arg(time.elapsed());
ui->label_5->setText(s);
}
4.3 测试过程以及结果分析
第一轮,从上往下点按钮,结果如图,
调用同一个matlab程序的话,第一次接近两秒,第二次为0,ceshi1完事后,调用ceshi2以及ceshi3可以发现ceshi2和ceshi3用时基本相同。
第二轮,从下往上点按钮,结果如图
发现调用ceshi3程序也是接近两秒,随后ceshi2以及ceshi1的调用也是0.3秒多,很接近,然后最后调用cheshi1,时间就很短了。
结果(个人理解):
程序在调用matlab程序是需要按.pro文件中的路径进行寻找,先去找matlab的环境,然后再去找要运行的matlab程序,运行第一个程序后,对于后边的matlab程序来说,环境已经是找到的,只需要找程序就可以了,对于已经运行过一次的程序,环境和路径都是知道的就很快了。
4.4 处理办法
第一个按钮,执行thread_1Initialize();,就是给matlab程序初始化,第二个是初始化时间和程序运行时间,第二个就不会初始化了
第二次是直接初始化加运行,两次情况,初始化时间没啥规律,只是第二次情况相比第一次而言,运行时间会差0.003秒(测试多次),忽略不计。