Linux下Qt调用Matlab引擎

发表于:2014-4-15 10:00

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:安天宇Terence    来源:51Testing软件测试网采编

  Group project要用Qt做个界面,还需要链接matlab作数据分析,首要任务就是搭环境。历经挫折阿真是。。又重装系统又下安装包,耗费一整天,最终还是搞定了,分享一下。
  我的系统是Ubuntu 12.04.4 LTS,Matlab版本是R2013b。
  1. 首先安装Matlab,教程很多不赘述了。我的安装路径是/usr/local/MATLAB
  2. 新建个Qt工程。
  3. 打开工程中.pro文件,加入如下两行:
  INCLUDEPATH += /usr/local/MATLAB/R2013b/extern/include/
  LIBS += -L"/usr/local/MATLAB/R2013b/bin/glnxa64" -leng -lmat -lmex -lmx -Wl,-rpath=/usr/local/MATLAB/R2013b/bin/glnxa64
  把路径改成自己电脑里matlab的路径就行。
  4.在cpp文件中#include <engine.h>,具体参照如下代码
#include <QtGui/QApplication>
#include <QDebug>
#include <cmath>
#include <iostream>
#include <engine.h>
int main(int argc, char *argv[])
{
// Test 1:将C++中的数据送入Matlab执行
// [1] 启动Matlab引擎
Engine *ep = engOpen(NULL);
if (!ep)
{   // 定义Matlab引擎指针,启动引擎;失败则返回NULL
qDebug() << "Can't start Matlab engine!";
exit(-1);
}
engSetVisible(ep, false);
// [2] 在C++内存空间构造需要计算或者画图的数据
const int N_SIZE = 10;
double x[N_SIZE],y[N_SIZE];
for (int i=0; i<N_SIZE; i++) //计算数组x和y
{
x[i] = (i+1);
y[i] = sin(x[i]); //产生正弦值
}
// [3] 在C++内存空间定义Matlab数组
mxArray *xx = mxCreateDoubleMatrix(1,N_SIZE, mxREAL); // 定义mxArray,为行,N_SIZE 列的实数数组
mxArray *yy = mxCreateDoubleMatrix(1,N_SIZE, mxREAL);
// [4] 将数据拷贝到数组中
memcpy(mxGetPr(xx), x, N_SIZE*sizeof(double)); // 将数组x复制到mxarray数组xx中
memcpy(mxGetPr(yy), y, N_SIZE*sizeof(double));
// [5] 将C++内存空间的数据传输到Matlab引擎中
engPutVariable(ep, "xx",xx);  // 将mxArray数组xx写入到Matlab工作空间,命名为xx
engPutVariable(ep, "yy",yy);
// [6] 执行Matlab引擎
engEvalString(ep, "plot(xx, yy); "); // 向Matlab引擎发送画图命令
// [7] 销毁C++内存空间的数据
mxDestroyArray(xx);    // 销毁mxArray数组xx和yy
mxDestroyArray(yy);
// Test 2:显示Matlab控制台输出信息
// [1] 将Matlab的输出连接到buffer
const int BUFSIZE = 1024;
char buffer[BUFSIZE] = {'\0'};
engOutputBuffer(ep, buffer, BUFSIZE);
// [2] 显示Matlab里数据的值
engEvalString(ep, "xx");
qDebug() << buffer;
engEvalString(ep, "yy");
qDebug() << buffer;
// Test 3:从Matlab引擎传回数据
mxArray *_xx = engGetVariable(ep, "xx");
double *_x = mxGetPr(_xx);
mxArray *_yy = engGetVariable(ep, "yy");
double *_y = mxGetPr(_yy);
for (int i = 0; i < N_SIZE; i++)
{
qDebug() << "i=" <<  i << "|" << _x[i] << _y[i];
}
// 销毁mxArray数组_xx和_yy
mxDestroyArray(_xx);
mxDestroyArray(_yy);
//Test 4:执行自定义函数
engEvalString(ep, "cd E:\\Dev\\MATLAB7\\work\\business_uc; c = add(1,2)");
qDebug() << buffer;
engClose(ep); //关闭Matlab引擎
return 0;
}
  c++调用matlab engine的教程也很多,不再赘述。
  在第三步卡了N久!编译总是通不过,最后发现需要link几个包。具体机制还是不太了解,以后再学习下。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号