启动matlab引擎.doc_第1页
启动matlab引擎.doc_第2页
启动matlab引擎.doc_第3页
启动matlab引擎.doc_第4页
启动matlab引擎.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Visual C+ 是当前主流的应用程序开发环境之一,开发环境强大,开发的程序执行速度快。但在科学计算方面函数库显得不够丰富、读取、显示数据图形不方便。 Matlab 是一款将数值分析、矩阵计算、信号处理和图形显示结合在一起,包含大量高度集成的函数可供调用,适合科学研究、工程设计等众多学科领域使用的一种简洁、高 效的编程工具。不过由于 Matlab 使用的是解释性语言,大大限制了它的执行速度和应用场合。基于 VC 和 Matlab 混合编程是很多熟悉 VC+ 编程而又需要进行科学计算、数据仿真的科研人员常用的一种方式,其中最简单也最直接的方法就是调用 Matlab 引擎。本文以下部分将详细介绍通过 VC+6.0 调用 Matlab6.5 引擎来达到 VC+ 与 Matlab 数据共享编程的方法。 1. 什么是 Matlab 引擎所谓 Matlab 引擎( engine ),是指一组 Matlab 提供的接口函数,支持 C/C+ 、 Fortran 等语言,通过这些接口函数,用户可以在其它编程环境中实现对 Matlab 的控制。可以主要功能有: 打开 / 关闭一个 Matlab 对话; 向 Matlab 环境发送命令字符串; 从 Matlab 环境中读取数据; 向 Matlab 环境中写入数据。与其它各种接口相比,引擎所提供的 Matlab 功能支持是最全面的。通过引擎方式,应用程序会打开一个新的 Matlab 进程,可以控制它完成任何计算和绘图操作。对所有的数据结构提供 100% 的支持。同时,引擎方式打开的 Matlab 进程会在任务栏显示自己的图标,打开该窗口,可以观察主程序通过 engine 方式控制 Matlab 运行的流程,并可在其中输入任何 Matlab 命令。实际上,通过引擎方式建立的对话,是将 Matlab 以 ActiveX 控件方式启动的。在 Matlab 初次安装时,会自动执行一次:matlab /regserver将自己在系统的控件库中注册。如果因为特殊原因,无法打开 Matlab 引擎,可以在 Dos 命令提示符后执行上述命令,重新注册。 2. 配置编译器要在 VC 中成功编译 Matlab 引擎程序,必须包含引擎头文件 engine.h 并引入 Matlab 对应的库文件 libmx.lib 、 libmat.lib 、 libeng.lib 。具体的说,打开一个工程后,做如下设置(以 VC6 为例): 1) 通过菜单工程 / 选项,打开设置属性页,进入 Directories 页面,在目录下拉列表框中选择 Include files ,添加路径: C:matlabexterninclude (假定 matlab 安装在 C:matlab 目录)。 2) 选择 Library files ,添加路径: C:matlabexternlibwin32microsoftmsvc60 。 3) 通过菜单工程 / 设置,打开工程设置属性页,进入 Link 页面,在 Object/library modules 编辑框中,添加文件名 libmx.lib libmat.lib libeng.lib 。以上步骤 1) 、 2) 只需设置一次,而步骤 3) 对每个工程都要单独设定,对于其它 C+ 编译器如 Borland C+ builder ,设置大体相同,不再赘述。 3. 引擎 API 详解在调用 Matlab 引擎之前,首先应在相关文件中加入一行: #include enging.h ,该文件包含了引擎 API 函数的说明和所需数据结构的定义。可以在 VC 中调用的引擎函数分别如下: 3.1 引擎的打开和关闭 engOpen 打开 Matlab engine函数声明:Engine *engOpen(const char *startcmd);参数 startcmd 是用来启动 Matlab 引擎的字符串参数,在 Windows 操作系统中只能为 NULL 。函数返回值是一个 Engine 类型的指针,它是在 engine.h 中定义的 engine 数据结构。 EngClose 关闭 Matlab 引擎函数声明:int engClose(Engine *ep);参数 ep 代表要被关闭的引擎指针。函数返回值为 0 表示关闭成功,返回 1 表示发生错误。例如,通常用来打开 / 关闭 Matlab 引擎的代码如下:Engine *ep; / 定义 Matlab 引擎指针。if (!(ep=engOpen(NULL) / 测试是否启动 Matlab 引擎成功。MessageBox(Cant start Matlab engine! );exit(1);. engClose(ep); / 关闭 Matlab 引擎。 3.2 向 Matlab 发送命令字符串 engEvalString 发送命令让 Matlab 执行。函数声明:int engEvalString(Engine *ep, Const char *string);参数 ep 为函数 engOpen 返回的引擎指针,字符串 string 为要 matlab 执行的命令。函数返回值为 0 表示成功执行,返回 1 说明执行失败(如命令不能被 Matlab 正确解释或 Matlab 引擎已经关闭了)。 3.3 获取 Matlab 命令窗口的输出要在 VC 中获得函数 engEvalString 发送的命令字符串被 Matlab 执行后在 matlab 窗口中的输出,可以调用 engOUtputBuffer 函数。函数声明:int engOutputBuffer(Engine *ep, char *p, int n);参数 ep 为 Matlab 引擎指针, p 为用来保存输出结构的缓冲区, n 为最大保存的字符个数,通常就是缓冲区 p 的大小。该函数执行后,接下来的 engEvalString 函数所引起的命令行输出结果会在缓冲区 p 中保存。如果要停止保存,只需调用代码: engOutputBuffer(ep, NULL, 0) 。 3.4 读写 Matlab 数据 3.4.1 从 Matlab 引擎工作空间中获取变量。mxArray *engGetVariable(Engine *ep, const char *name);参数 ep 为打开的 Matlab 引擎指针, name 为以字符串形式指定的数组名。函数返回值是指向 name 数组的指针,类型为 mxArray* ( mxArray 数据类型在本文第 4 节详细简介)。 3.4.2 向 Matlab 引擎工作空间写入变量。int engPutVariable(Engine *ep, const char *name, const mxArray *mp);参数 ep 为打开的 Matlab 引擎指针, mp 为指向被写入变量的指针, name 为变量写入后在 Matlab 引擎工作空间中的变量名。函数返回值为 0 表示写入变量成功,返回值为 1 表示发生错误。 3.5 调用引擎时显示 / 隐藏 Matlab 主窗口默认情况下,以 engine 方式调用 Matlab 的时候,会打开 Matlab 主窗口,可在其中随意操作。但有时也会干扰应用程序的运行,可用以下设置是否显示该窗口。int engSetVisible(Engine *ep, bool value);参数 ep 为打开的 Matlab 引擎指针, value 为是否显示的标志,取值 true (或 1 )表示显示 Matlab 窗口,取值 false (或 0 )表示隐藏 Matlab 窗口。函数返回值为 0 表示设置成功,为 1 表示有错误发生。要获得当前 Matlab 窗口的显示 / 隐藏情况,可以调用函数:int engGetVisible(Engine *ep, bool *value);参数 ep 为打开的 Matlab 引擎指针, Value 为用来保存显示 / 隐藏情况的变量(采用指针方式传递)。函数返回值为 0 表示获取成功,为 1 表示有错误发生。4. 数据类型 mxArray 的操作在上节的 Matlab 引擎函数中,所有与变量有关的数据类型都是 mxArray 类型。数据结构 mxArray 以及大量的 mx 开头的函数,广泛用于 Matlab 引擎程序和 Matlab C 数学库中。 mxArray 是一种很复杂的数据结构,与 Matlab 中的 array 相对应,我们只需熟悉 Matlab 的 array 类型和几个常用的 mxArray 函数即可。在 VC 中,所有和 Matlab 的数据交互都是通过 mxArray 来实现的,在使用 mxArray 类型的程序中,应包含头文件 matrix.h ,不过在引擎程序中,一般会包含头文件 engine.h ,该文件里面已经包含了 matrix.h ,因此无需重复包含。 4.1 创建和清除 mxArray 型数据 Matlab 有很多种变量类型,对应于每种类型,基本上都有一个函数用于创建,但它们都有相同的数据结构,就是 mxArray 。数组的建立采用 mxCreatexxx 形式的函数,例如新建一个 double 类型数组,可用函数 mxCreateDoubleMatrix ,函数形式如下:mxArray *mxCreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag);参数 m 和 n 为矩阵的函数和列数。 ComplexFlag 为常数,用来区分矩阵中元素是实数还是复数,取值分别为 mxREAL 和 mxCOMPLEX 。例如,创建一个 3 行 5 列的二维实数数组,可用如下语句:mxArray *T = mxCreateDoubleMatrix(3, 5, mxREAL);对应的,要删除一个数组 mxDestroyArray ,该函数声明如下:void mxDestroyArray(mxArray *array_ptr);参数 array_ptr 为要删除的数组指针。例如,要删除上面创建的数组 T ,可用如下语句:mxDestroyArray(T);类似的创建函数还有:mxArray *mxCreateString(const char *str);创建一个字符串类型并初始化为 str 字符串。一般的在 VC 与 Matlab 交互中,以上两种类型就够了,其它类型数组的创建这里不再介绍。 4.2 管理 mxArray 数据类型 4.2.1 管理 mxArray 数据大小要获得 mxArray 数组每一维上元素的个数,可以用 mxGetM 和 mxGetN 函数。其中 mxGetM 用来获得数组第一维的元素个数,对于矩阵来说就是行数。int mxGetM(const mxArray *array_ptr); / 返回 array_ptr 对应数组第一维的元素个数(行数)int mxGetN(const mxArray *array_ptr); / 返回 array_ptr 对应数组其它维的元素个数,对于矩阵来说是列数。对于多维数组来说是从第 2 维到最后一维的各维元素个数的乘积。要获得某一特定维的元素个数,则要用函数:const int *mxGetDimensions(const mxArray *array_ptr);该函数返回 array_ptr 各维的元素个数保存在一个 int 数组中返回。对于常用的矩阵来说,用 mxGetM 和 mxGetN 两个函数就可以了。另外还可以通过 mxGetNumberOfDimensions 来获得数组的总的维数,用 mxSetM 、 mxSetN 设置矩阵的行数和列数,函数说明如下:int mxGetNumberOfDimensions(const mxArray *array_ptr); / 返回数组的维数void mxSetM(mxArray *array_ptr, int m); / 设置数组为 m 行void mxSetN(mxArray *array_ptr, int n); / 设置数组为 n 列 4.2.2 判断 mxArray 数组类型在对 mxArray 类型的变量进行操作之前,可以验证以下其中的数组的数据类型,比如是否为 double 数组、整数、字符串、逻辑值等,以及是否为某种结构、类、或者是特殊类型,比如是否为空数组,是否为 inf 、 NaN 等。常见的判断函数有:bool mxIsDouble(const mxArray *array_ptr);bool mxIsComplex(const mxArray *array_ptr);bool mxIsChar(const mxArray *array_ptr);bool mxIsEmpty(const mxArray *array_ptr);bool mxIsInf(double value); 这些函数比较简单,意义自明,不再解释。 4.2.3 管理 mxArray 数组的数据对于常用的 double 类型的数组,可以用 mxGetPr 和 mxGetPi 两个函数分别获得其实部和虚部的数据指针,这两个函数的声明如下:double *mxGetPr(const mxArray *array_ptr); / 返回数组 array_ptr 的实部指针double *mxGetPi(const mxArray *array_ptr); / 返回数组 array_ptr 的虚部指针这样,就可以通过获得的指针对 mxArray 类型的数组中的数据进行读写操作。例如可以用函数 engGetVariable 从 Matlab 工作空间读入 mxArray 类型的数组,然后用 mxGetPr 和 mxGetPi 获得数据指针,对并其中的数据进行处理,最后调用 engPutVariable 函数将修改后的数组重新写入到 Matlab 工作空间。具体实现见第 5 节程序实例。5. 程序实例对大部分软件研发人员来说利用 VC 编程方便、高效,但是要显示数据图形就不那么容易了,这时候不防借助 Matlab 引擎辅助画图做数据分析。下面通过实例演示如何利用 VC 调用 Matlab 绘图,程序的主要功能是在 VC 中对数组 x 计算函数值 y sin(x) log(x) ,然后调用 Matlab 绘制 y 对 x 的图形。在 VC 中新建工程,编写代码如下:#include #include #include engine.husing namespace std;void main() const int N = 50; double xN,yN; int j = 1; for (int i=0; iN; i+) / 计算数组 x 和 y xi = (i+1); yi = sin(xi) + j * log(xi); / 产生之间的随机数赋给 xxi; j *= -1; Engine *ep; / 定义 Matlab 引擎指针。 if (!(ep=engOpen(NULL) / 测试是否启动 Matlab 引擎成功。 cout Cant start Matlab engine! endl; exit(1); / 定义 mxArray ,为行, N 列的实数数组。 mxArray *xx = mxCreateDoubleMatrix(1,N, mxREAL); mxArray *yy = mxCreateDoubleMatrix(1,N, mxREAL); / 同上。 memcpy(mxGetPr(xx), x, N*sizeof(double); / 将数组 x 复制到 mxarray 数组 xx 中。 memcpy(mxGetPr(yy), y, N*sizeof(double); / 将数组 x 复制到 mxarray 数组 yy

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论