您的位置:首页 > 运维架构 > Linux

Linux下Qt调用Matlab引擎

2014-04-14 05:20 183 查看
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几个包。具体机制还是不太了解,以后再学习下。












                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: