织梦CMS - 轻松建站从此开始!

罗索

VC++调用MATLAB engine

jackyhwei 发布于 2011-09-06 12:08 点击:次 
VC++调用MATLAB engine
TAG:

实验环境:
MATLAB5.3, Visual C++ 6.0 SP3

1 生成几个连接库文件

在目录 c:\matlab\extern\include 下找这几个文件:
libeng.def libmx.def libmat.def
在DOS行命令下生成三个库文件:
c:\msdev\bin\lib /def:libmat.def /out:libmat.lib
c:\msdev\bin\lib /def:libeng.def /out:libeng.lib
c:\msdev\bin\lib /def:libmx.def /out:libmx.lib
把生成的三个LIB文件加入你的LINK项
libeng.lib libmx.lib libmat.lib

2 写包含engine功能的文件

可以参考:
c:\matlab\extern\examples\eng_mat\engwindemo.c
注意: 可以用.CPP做后缀。比如:MATLAB.CPP

3 设置编译选项

把MATLAB.C加入你的PROJECT
MATLAB.C的开头加入两行:
    #INCLUDE "stdafx.h"
    #INCLUDE "engine.h"
包含其它头文件, 自己看情况而定

4 编写调用engine的函数

比如响应菜单调用自己的函数matlabPlot,而此函数的实现在matlab.cpp文件中实现,内容如下:

  1. #include "stdafx.h" 
  2. #include "engine.h" 
  3.  
  4. int MatlabDraw() 
  5. Engine *ep; 
  6. if (!(ep = engOpen(NULL))) { 
  7.         MessageBox ((HWND)NULL,"Can't start MATLAB engine","Matlab Draw",MB_OK); 
  8.         return 0; 
  9.     } 
  10. engEvalString(ep, "x=0:0.01:2*pi;y=sin(x);plot(x,y);"); 
  11. engEvalString(ep, "title('Matlab Drawing');"); 
  12. engEvalString(ep, "xlabel('X');"); 
  13. engEvalString(ep, "ylabel('Y');"); 
  14. MessageBox(NULL, "Press any key …","MATLAB Draw",MB_OK); 
  15. engClose(ep); 
  16. return 1; 

5 设置其它编译连接选项

PreProcessor 加上: MATLAB_MEX_FILE
INCLUDE      加上: c:\matlab\extern\include
LIB          加上: c:\matlab\extern\include

最后,如果有必要的话,在DOS命令行运行: MATLAB /regserver

vc调用matlab引擎的一个简单例子

按如下步骤在vc中使用matlab引擎:

(1)。启动vc6。0,建立一个mfc(exe)类型工程matlabengine。

(2)。在项目建立后,设置环境。

Tool->options->Diretories 页面下Show directories for

先选择Include Files,输入路径:D:\PROGRAMS\MATLAB6P5P1\EXTERN\INCLUDE

在选择Library Files,输入路径:D:\PROGRAMS\MATLAB6P5P1\EXTERN\LIB\WIN32\MICROSOFT\MSVC60

(我的matlab根目录是 D:\PROGRAMS\MATLAB6P5P1\ ;这里的设置对不同工程只需要一次)

(3)。打开Project->Settings->Link页面,在Object/Library modules中加入libmatlb.lib libeng.lib libmx.lib。(这里对每个工程都要设置,并且根据需要选不同的库)

(4) 在工程目录的view的头文件中加入

#include "engine.h"

(5) 在about 对话框加入一个按钮,在其按钮响应函数如下:

  1. void CAboutDlg::OnButton1() 
  2.       Engine *ep; 
  3.       double t[1]; 
  4.       t[0]=6.28; 
  5.       mxArray *T=NULL; 
  6.       if(!(ep=engOpen(NULL))) 
  7.       { 
  8.         AfxMessageBox("Can not open the matlab engine!"); 
  9.         exit(-1); 
  10.       } 
  11.       T=mxCreateDoubleMatrix(1,1,mxREAL); 
  12.       memcpy((char*)mxGetPr(T),(char*)t,1*sizeof(double)); 
  13.       engPutVariable(ep,"T",T); 
  14.       engEvalString(ep,"T1=0:pi/48:T;"); 
  15.       engEvalString(ep,"D=sin(T1)"); 
  16.       engEvalString(ep,"plot(T1,D,'r-');"); 
  17.       engEvalString(ep,"xlabel('t‘);"); 
  18.       engEvalString(ep,"ylabel('sin(t)');"); 
  19.       engEvalString(ep,"title('sin(x)的图像');"); 
  20.       mxDestroyArray(T); 
(ilovejoy)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201109/14961.html]
本文出处:hi.baidu.com/ilovejoy 作者:ilovejoy
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容