Qt(C++)调用MATLAB的几种方法

2019.0405增加:
最近做一个项目,测试一个库的运行情况。这个是时候需要把库得到的数据用图像展示出来。但是目前的测试函数做的是命令行下的,所以各种绘图方式都不好加,于是乎又想到了MATLAB的eg调用方式,这个简直就是为了这种情景而生。
很不幸的是好长时间过去了,我都忘了到底怎么调用了,而当我百度的时候,这个文章出现在结果的第二条,我点开看了,突然才发现了好几个错别字,关键是我给的例子不够完善,不能够直接运行。这就很尴尬了。。。
其实我们这里需要的关注就是一下的几个地方
1.包含头文字
#include "engine.h"
这里需要注意的是,我们需要先增加这个文件所在的目录到项目的包含目录(C:\Program Files (x86)\MATLAB\R2015b\extern\include)
2.增加libmx.lib,libmx.lib同时,这里我们先增加这个库到项目的库目录(C:\Program Files (x86)\MATLAB\R2015b\extern\lib\win32\microsoft)
3.增加dll文件到path环境变量中,环境变量的增加就很多种方式了。可以直接增加到系统的环境变量,也可以在系统的运行环境中 增加这些。
这次的增加就这些吧
Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。正如Qt官网的说法:https://www1.qt.io/cn/   
软件开发变得更加智能

创建流畅的、高性能与直观的UI及嵌入式设备——不同平台只需一套代码。

 Qt的优势就是可以一套代码兼容多平台,这个也是我比较亲睐Qt的原因。

MATLAB

MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。

MATLAB语法特征与C++语言极为相似,而且更加简单,更加符合科技人员对数学表达式的书写格式。使之更利于非计算机专业的科技人员使用。而且这种语言可移植性好、可拓展性极强,这也使得MATLAB能够深入到科学研究及工程计算各个领域。

这个也决定了MATLAB也是比较容易在别的语言中集成,这里也就是举例一下几种常见的Qt与MATLAB的交互方式。

1.通过文本文件交互。

这个就是比较简单,各自独立的。只需要分别操作文本文件就行。

MATLAB写文件,和c的语法一样:

fid = fopen('test.txt','a');
test = 10;
fprintf(fid,'%d \t ',baocun);
fprintf(fid,'\r\n'); % 换行
fclose(fid);

Qt读取文件,语法很简单:

QString displayString;
QFile file("test.txt");
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
    qDebug()<<"Can't open the file!"<<endl;
}
while(!file.atEnd())
{
    QByteArray line = file.readLine();
    QString str(line);
    qDebug()<< str;
    displayString.append(str);
}

这样就可以实现MATLAB的数据,缺点是交互很慢。不能处理数据交互频繁的需求。只作为参考,强烈不推荐的方式。

2.调用MATLAB独立引擎的。

Engine *eg = engOpen(NULL);      //打开MATLAB引擎
 
    bool flag =engEvalString(eg, "cd  D:/Qt");                  //向MATLAB发送字符串命令
 
    //修改工作路径
 
mxArray *a = NULL;
 
double init = 2;
a = mxCreateDoubleMatrix(1, 1, mxREAL);
memcpy((void*) mxGetPr(a), (void*)&init, sizeof (double));
engPutVariable(pEng, "A", A);
 
init = 1;
memcpy((void*) mxGetPr(a), (void*)&init, sizeof (double));
engPutVariable(pEng, "b", a);
 
mxDestroyArray(A);
    engEvalString(ep, "s=add(a,b);");                      //求和
 
    engEvalString(ep, "save test.mat;");                    //保存所有变量
 
 
    mxArray *s = engGetVariable(ep, "s");                  //将MATLAB变量传回VS空间
 
    printf("s=%f", *mxGetPr(s));      //打印结果
 
    engClose(ep);                 //关闭精简版MATLAB

这种方法比较适合需要调用图形库的,可以很方便是嫌绘图的功能。但是同样的缺点就是速度比较慢。会有独立的窗口出现,用户体验不够完美。

3.转换MATLAB程序到c/c++语言。

这个方法操作起来很简单,如图:

直接按提示操作就行。这里的简单只是说操作简单,而实际的使用中发现,这个东西很不好用,很多函数或者借口不支持。这个也是不推荐的方法。

4.将MATLAB程序生成dll库

这个方法也是相对比较简单,是比较常用的方法。

具体请参考:https://blog.csdn.net/hongandyi/article/details/79433623

我比较推荐这种用法,数据交互比较快,不会影响程序的整理运行效果。比较需要注意的就是一定要首先调用xxxxInitialize()(xxxx是你的函数库名),因为别的错误编译的时候会报错,很容易就能找到问题,而如果不运行xxxxInitialize()则会在运行的时候报错,新手可能就手足无措,找不到问题了。

 

好了,上边就是据我所知的四种调用MATLAB的方法,文章比较粗糙,当然专注技术这不能成为理由。还是水平有限,需要的人将就着看吧。当然如果有别的方法也欢迎交流。QQ:371359001

文章欢迎转载。