2019.09.08增加:
1.很多人不知道,实际用的时候,不能直接用实际的含有空格的目录。所有的还有空格的录用可以使用$$quote()包含处理一下
INCLUDEPATH += $$quote(C:/Program Files (x86)/MATLAB/R2015b/extern/include)
LIBS += -L$$quote(C:/Program Files (x86)/MATLAB/R2015b/extern/lib/win32/microsoft)
LIBS += -llibeng -llibmat -llibmx -llibmex
2.调用matlab的时候,可能会出现方向对了,却怎么也不能调用启动引擎的情况,这个是因为 在Matlab初次安装时,会自动执行一次:matlab /regserver将自己在系统的控件库中注册。假如因为特别原因,无法打开Matlab引擎,能够在Dos命令提示符后执行上述命令,重新注册。这个需要用管理员身份。
-
-
2019.04.05增加: 最近做一个项目,测试一个库的运行情况。这个是时候需要把库得到的数据用图像展示出来。但是目前的测试函数做的是命令行下的,所以各种绘图方式都不好加,于是乎又想到了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的语法一样:
[codesyntax lang=”cpp-qt”]
fid = fopen('test.txt','a');
test = 10;
fprintf(fid,'%d \t ',baocun);
fprintf(fid,'\r\n'); % 换行
fclose(fid);
[/codesyntax]
Qt读取文件,语法很简单:
[codesyntax lang=”cpp-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);
}
[/codesyntax]
这样就可以实现MATLAB的数据,缺点是交互很慢。不能处理数据交互频繁的需求。只作为参考,强烈不推荐的方式。
2.调用MATLAB独立引擎的。
[codesyntax lang=”cpp-qt”]
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
[/codesyntax]
这种方法比较适合需要调用图形库的,可以很方便是嫌绘图的功能。但是同样的缺点就是速度比较慢。会有独立的窗口出现,用户体验不够完美。
2019.10.12更新:
matlab提供了函数:engSetVisible(eg, false);可以隐藏窗口
3.转换MATLAB程序到c/c++语言。
这个方法操作起来很简单,如图:

直接按提示操作就行。这里的简单只是说操作简单,而实际的使用中发现,这个东西很不好用,很多函数或者借口不支持。这个也是不推荐的方法。
4.将MATLAB程序生成dll库
这个方法也是相对比较简单,是比较常用的方法。
具体请参考:https://blog.csdn.net/hongandyi/article/details/79433623
我比较推荐这种用法,数据交互比较快,不会影响程序的整理运行效果。比较需要注意的就是一定要首先调用xxxxInitialize()(xxxx是你的函数库名),因为别的错误编译的时候会报错,很容易就能找到问题,而如果不运行xxxxInitialize()则会在运行的时候报错,新手可能就手足无措,找不到问题了。
好了,上边就是据我所知的四种调用MATLAB的方法,文章比较粗糙,当然专注技术这不能成为理由。还是水平有限,需要的人将就着看吧。当然如果有别的方法也欢迎交流。QQ:371359001
文章欢迎转载。
发表回复