在VisualC++中使用engine,除VC中进行必要的环境配置外,基本上与C语言中使用engine相一致。本节以一个简单的例子“VCeng1”工程来说明在VisualC++中使用MATLAB engine。
(1) VisualC++工程创建
启动VisualC++并单击File->New,打开Project对话框来创建各种VC工程,选取MFC Appwizard(exe)(图1-2,其它程序基本相同)。在loctation编辑框中输入欲创建工程的保存路径,在Project name编辑框中输入工程名如“VCeng1”,单击OK进入下一步工程设置对话框,选中single document,单击Finish完成VCeng1工程创建。
图1-2 创建VCeng1工程
(2)环境配置
•设定头文件和库文件路径
菜单Tools->Options->Directories
Include files:添加%MATLAB7%extern\include
Library files:添加%MATLAB7%\Extern\Lib\Win32\Microsoft\Msvc60
•设置编译连接选项
菜单Project->Settings
Link->Object/Library modules: 添加libmat.lib libeng.lib libmx.lib libmex.lib
General->Microsoft Foundation Classes: Use MFC in a Static Library
(3)添加响应函数
在ResourceView中打开菜单IDR_MAINFRAME,添加MATLABEngine->VCeng1菜单项(图1-3),再利用ClassWizard为VCeng1菜单添加CVCeng1View窗口Command消息映射函数OnMenuVCeng1()。
图1-3 OnMenuVCeng1()消息映射函数
(4)调用引擎库函数
•在调用引擎库的头文件中添加引擎库头文件"engine.h":
本例在“VCeng1View.h”中添加:#include "engine.h"。
•在调用引擎库的实现文件中添加引擎调用代码:
本例在“VCeng1View.cpp”的响应函数OnMenuVCeng1()中添加如下代码:
/////////////////////////////引擎库函数调用代码清单
void CVCeng1View::OnMenuVCeng1()
{
Engine *ep; ///////////引擎对象指针声明
double t[1];
t[0]=6.28;
mxArray *T=NULL;
if(!(ep=engOpen(NULL)))//////////打开引擎
{ AfxMessageBox("Can not open the MATLAB engine!"); exit(-1);}
T=mxCreateDoubleMATrix(1,1,mxREAL);
memcpy((char*)mxGetPr(T),(char*)t,1*sizeof(double));
///////////////////////通过引擎库函数调用MATLAB命令
engPutVariable(ep,"ep_T",T);
engEvalString(ep,"ep_T1=0:pi/48:ep_T;");
engEvalString(ep,"ep_D=sin(ep_T1)");
engEvalString(ep,"plot(ep_T1,ep_D,'r-');");
engEvalString(ep,"xlabel('t');");
engEvalString(ep,"ylabel('sin(t)');");
engEvalString(ep,"title('sin(x) curve');");
AfxMessageBox("关闭引擎");
engClose(ep); //////////关闭引擎,引擎工作空间的变量由MATLAB自动内存释放机制释放
mxDestroyArray(T); ///////Single Document空间中变量的内存释放
}
/////////////////结束
在VisualC++中编译执行VCeng1,程序通过引擎启动MATLAB,并调用MATLAB命令完成sin(x)曲线绘制后(图1-4),调用MFC消息框提示用户进程将关闭引擎程序。用户确认后,关闭引擎程序,进程返回到Single Document程序框架,便等待用户的其他操作。
图1-4 VCeng1通过引擎库调用MATLAB命令绘制的正弦曲线