加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Matlab引擎库函数

(2011-05-06 10:16:11)
标签:

杂谈

分类: 技术类

  Matlab引擎库包含了一系列从外部应用程序调用和控制Matlab引擎的函数。下表列举了C语言的引擎库函数,这些函数后使用了eng前缀名

 

表 1  C语言引擎函数库

引擎函数

功能描述

engOpen

启动Matlab计算引擎

engGetArray

从Matlab引擎获得一个Matlab矩阵,用于数据交换

engPutArray

从应用程序向Matlab引擎发送一个Matlab矩阵,用于数据交换

engEvalString

执行一个Matlab命令

engOutputBuffer

创建字符缓冲区,以获得Matlab文本输出

engOpenSingleUse

打开一个单独的非共享的Matlab计算引擎

engClose

关闭Matlab引擎

engSetVisible

设置Matlab引擎

engGetVisible

返回Matlab显示状体

engGetVariable

从Matlab工作区(Workspace)获得一个变量

engPutVariable

将指定名称的Matlab变量存入Matlab工作区

 

关于这些函数的调用方式,可参阅Matlab的帮助文件。一般来说,在程序中调用Matlab计算引擎包含如下3个步骤:

(1)   打开Matlab计算引擎。

(2)   在引擎中执行Matlab命令,或者传递数据等。

(3)   关闭Matlab计算引擎。

打开Matlab计算引擎需要调用engOpen函数,成功打开Matlab引擎后,将

在程序中获得指向该引擎的指针。通过这个指针,就可以调用引擎来执行Matlab命令了,这需要调用engEvalString函数。完成对Matlab计算引擎的调用之后,应该关闭该引擎,这需要调用engClose。

1.      engOpen

函数原型:extern Engine *engOpen(const char *startcmd)

参数说明:输入参数为一个字符指针,函数通过该指针指向的字符串所包含

的命令与Matlab简历一个连接,打开一个Matlab进程,返回一个Matlab引擎类型的指针。

2.      engEvalString

函数原型:extern int engEvalString(Engine *ep, const char *string)

参数说明:ep为engOpen打开的engine指针。String为字符串,指向一个需

要在Matlab计算引擎的工作区中执行的字符串。函数返回0表示成功执行,返回1则表示ep对应的Matlab Engine 已经关闭。

3.      engClose

函数原型:extern int engClose(Engine *ep)

参数说明:输入参数ep为已经打开的Matlab计算引擎。返回0表示成功关

闭,返回1表示返回出错。

关于更多的引擎函数的具体定义可以参见帮助文件。

1.2.    Visual C++调用Matlab引擎时的环境设置

当在Visual C++环境下调用Matlab引擎时,编译接口环境的配置较为简单,主要有一下两步(本地计算机Matlab安装在目录C:\MATLAB下)

 

1.      添加Matlab引擎库的头文件和库函数的路径

 

打开菜单“Tools”,选取“Options…—>Direction”。在“Show directories for”选项卡选取“Include files”,添加“C:\MATLAB\EXTERN\LIB\WIN32\MICROSOFT\MSVisual C++60”(如图3所示),因为这些引擎库用到的动态链接库都在此目录下。

 

2.      完成Matlab引擎对应的静态链接库的导入工作

 

在菜单“Project—>Setting”下,选取“Link”选项卡,在“Objecct/Library Modules”里添加libmx.lib、libmex.lib和libeng.lib。注意三个文件名中间以空格分开(如图4所示)

经实验发现,还可以将此步设置改为:在Visual C++ 6.0环境中,选择“Project”菜单中的“Add to Project”命令,然后选择Files选项,将“C:\MATLAB\EXTERN\INCLUDE\LIB\WIN32\MICROSOFT\MSVC60”目录下的liteng.lib,limex.lib,libmx.lib文件加到工程中。它同样可以将三个静态链接库添加到当前工程中来。

 

 

图 4  Include files 路径配置对话框

 

 

图 5  Engine方式静态链接库设置

 

1.3.    Visual C++调用Matlab引擎实例

下面通过一个简单的实例来说明Matlab引擎的使用,它是一个基于对话框的MFC应用程序,Visual C++下利用Matlab工具箱进行信号处理和图形显示的操作。

启动Visual C++,建立一个新工程,选择MFC AppWizard,工程名为MATLABEngine。而后选择“Dialog based”,即生成一个基于对话框的MFC应用程序。其余各项采用默认设置。

使用库的头文件matlib.h。首先添加Matlab引擎库的头文件和库函数的路径,然后在MATLABEngineDlg.cpp中添加engine.h。

添加Matlab引擎库对应的静态链接库文件

在对话框窗体中添加一个按钮,如下图所示设置按钮的标题和控件ID:

 

 

图 6  按钮控件的标题和控件ID设置对话框

 

通过Visual C++的ClassWizard,添加按钮的单击响应事件,并添加如下代码。

 

void CMATLABEngineDlg::OnMATLABEngine

{

      Engine *ep; //定义Matlab引擎变量

     

      MessageBox("单击确定按钮,Windows正在准备启动Matlab引擎!",

             "Matlab引擎", MB_OK|MB_ICONINFORMATION);

     

      if (!(ep=engOpen("\0")))   //打开Matlab引擎

      {

             fprintf(stderr, "\n Matlab引擎启动失败!\n");

             MessageBox("Matlaby引擎启动失败!", "Matlab引擎",

MB_OK|MB_ICONERROR);

             exit(-1);

      }

 

      MessageBox("单击确定按钮,隐藏Matlab!", "Matlab引擎",

MB_OK|MB_ICONINFORMATION);

      engSetVisible(ep, 0); //隐藏Matlab窗口

 

      MessageBox("单击确定按钮,系统重新显示Matlab!", "Matlab引擎",

MB_OK|MB_ICONINFORMATION);

      engSetVisible(ep, 0); //重新显示Matlab窗口

 

      mxArray *T=NULL;

      double time[10]={0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0};

 

      //生成矩阵

      T=mxCreateDoubleMatrix(1, 10, mxREAL);

      memcpy((void *)mxGetPr(T), (void *)time, sizeof(time));

 

      //将矩阵变量写入Matlab引擎的工作区

      engPutVariable(ep, "T", T);

 

      //通过Matlab引擎执行Matlab命令

      engEvalString(ep, "D=0.5*(-9.8).*T.^2");

      engEvalString(ep, "plot(T,D);");

      engEvalString(ep, "title('Position vs.Time for falling object');");

      engEvalString(ep, "xlabel('Time(seconds)');");

      engEvalString(ep, "ylabel('Position(meters)');");

      engEvalString(ep, "grid on;");

 

      //释放矩阵变量T占用的内存空间

 

      mxDestroyArray(T);

 

      MessageBox("通过例程,说明Matlab的图形显示能力!",

             "Matlab引擎", MB_OK|MB_ICONINFORMATION);

 

      //画一朵花

      engEvalString(ep, "x=-8:0.5:8;");

      engEvalString(ep, "y=x;");

      engEvalString(ep, "[Y,X]=meshgrid(y,x);");

      engEvalString(ep, "R=sqrt(X.^2+Y.^2)+eps;");

      engEvalString(ep, "Z=2*sin(R)./R;");

      engEvalString(ep, "surf(X,Y,Z);");

 

      MessageBox("关闭Matlab引擎,系统将退出Matlab应用程序!",

             "Matlab引擎", MB_OK|MB_ICONINFORMATION);

      engClose(ep); //关闭Matlab引擎,退出Matlab

}

 

按F7键编译后再执行,将会出现对话框。单击“MATLABEngine”按钮,将会出现Windows的标准信息框,出现“单击确定按钮,Windows正在准备启动Matlab引擎!”提示信息。单击“确定”按钮,可以看到任务栏出现Matlab的图标,它表示Matlab已经启动。然后会出现“隐藏Matlab”的信息提示框,同样单击“确定”按钮,可以看到任务栏上的Matlab图标立即隐藏。此时Matlab仍在后台运行。然后,按照提示进行操作,系统会在任务栏出现“重新显示Matlab的图标”信息,并先后出现下面各图的实验结果。

 

 

图 7  实验结果一

 

可以看出,Matlab引擎工作方式实质上是Visual C++等通过编程平台实现了和Matlab的交互,它将需要在Matlab环境中执行的命令预先“存储”在Visual C++的应用程序中,然后自动的送给Matlab执行。当然,可以通过向Matlab引擎工作空间读取或写入变量实现Matlab和Visual C++的数据交互。

 

 

图 8  实验结果二

0

阅读 收藏 喜欢 打印举报/Report
后一篇:洗涤
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有