ubuntu c/c++中调用matlab函数

来源:互联网 发布:jquery ajax json解析 编辑:程序博客网 时间:2024/05/29 06:31
最近实验室一位伊拉克博士仁兄在写paper,要做仿真。需要在c++中调用matlab里面的函数。据说matlab已经有了动态链接库供调用,但是从网上百度google了下,暂时也没有找到比较详细的教程,就打算自己编译matlab某个函数的动态库。具体流程如下,以调用matlab中sin函数为例。


ubuntu12.04下的matlab安装请参照:

http://bbs.weiphone.com/read-htm-tid-6280022.html

1.编写mySin.m

[cpp] view plain copy
  1. function z = mySin(x)   
  2. z = sin(x);   
  3. end  

2.编译libMySin.so

       在matlab中打开mySin.m文件所在的路径,然后在matlab命令行中输入如下命令:

[cpp] view plain copy
  1. mcc -W cpplib:libMySin -T link:lib mySin -C  

       其中libMySin指的是生成的动态链接库的名字,mySin是matlab文件名。

3.编写cpp文件调用mySin,文件名为MainSin.cpp,和mySin.m在同一路径下

[cpp] view plain copy
  1. #include "mclmcrrt.h"  
  2. #include "mclmcr.h"  
  3. #include "mclcppclass.h"  
  4. #include "matrix.h"  
  5. #include <iostream>  
  6. #include "libMySin.h"  
  7.   
  8. int main(void)     
  9. {     
  10.     double a = 1.57;       
  11.     double b;     
  12.     // initialize lib,这里必须做初始化!     
  13.     if(!libMySinInitialize())     
  14.     {     
  15.     std::cout << "Could not initialize libMySin!" << std::endl;     
  16.     return -1;     
  17.     }     
  18.     // 为变量分配内存空间,可以查帮助mwArray     
  19.     mwArray mwA(1, 1, mxDOUBLE_CLASS); // 1,1表示矩阵的大小(所有maltab只有一种变量,就是矩阵,为了和Cpp变量接轨,设置成1*1的矩阵,mxDOUBLE_CLASS表示变量的精度)     
  20.     mwArray mwB(1, 1, mxDOUBLE_CLASS);       
  21.     
  22.     mwA.SetData(&a, 1);        
  23.     // using mySin,调用我们自己写的函数     
  24.     mySin(1, mwB, mwA);     
  25.     // get data  
  26.     b = mwB.Get(1, 1);     
  27.     printf("sin %f is %f\n",a, b);     
  28.     // 后面是一些终止调用的程序     
  29.     // terminate the lib     
  30.     libMySinTerminate();     
  31.     // terminate MCR     
  32.     mclTerminateApplication();     
  33.     return 0;     
  34. }    

4.编写Makefile
[cpp] view plain copy
  1. LIBPATH = -L/home/zk/matlab_test/mySin -L/usr/local/MATLAB/R2013b/runtime/glnxa64 -lmwmclmcrrt -lMySin  
  2. INCLUDEPATH = -I/usr/local/MATLAB/R2013b/extern/include/  
  3.   
  4. LD_LIBRARY_PATH = /home/zk/matlab_test/mySin:/usr/local/MATLAB/R2013b/runtime/glnxa64:$LD_LIBRARY_PATH  
  5. export LD_LIBRARY_PATH  
  6.   
  7. MainSin.o:MainSin.cpp  
  8.     g++ -c MainSin.cpp $(INCLUDEPATH)  
  9. MainSinApp:MainSin.o  
  10.     g++ -o MainSinApp MainSin.o $(LIBPATH)  
  11.     ./MainSinApp  
  12.   
  13. MainApp  
  14. clean:  
  15.     rm -f *.o  

LIBPATH 中:
[cpp] view plain copy
  1. /home/zk/matlab_test/mySi  
是我mySin.m文件所在的路径,编译的libMySin.so动态库所在的位置
[cpp] view plain copy
  1. /usr/local/MATLAB/R2013b/runtime/glnxa64  
是我电脑中matlab安装的路径,matlab动态库所在的位置


INCLUDEPATH也是matlab安装的路径,matlab头文件所在的位置。

5.在终端执行make命令就可以看到结果啦

[cpp] view plain copy
  1. make MainSinApp 
原创粉丝点击