VC++与Matlab混合编程之引擎操作详解

合集下载

VC与Matlab混合编程

VC与Matlab混合编程

VC与Matlab混合编程本⽂主要介绍VC与Matlab混合编程的两种⽅法,并详细介绍了VC向Matlab传递复杂数据:结构体的⽅法,有详细代码说明。

Matlab 主要⾯对科学计算、可视化以及交互式程序设计的⾼科技计算环境,但由于Matlab开发平台上开发的程序不能脱离Matlab运⾏环境,因⽽在处理⼀些实际应⽤问题时显得灵活性不⾜,⽽VC++则在⼀定程度上能够弥补这⼀漏洞,因此,将⼆者结合共⽤,各献其长,可以为科研⼯作和⼯程开发提供更为强⼤的技术⽀持。

Matlab作为控制系统设计的⼀种通⽤⼯具,它可以很⽅便的和VC进⾏连接。

⼀般⽽⾔,Matlab与VC混合编程的实现⽅法有很多种,这⾥主要介绍以下两种:1. VC调⽤Matlab Engine的⽅式:Matlab Engine是⼀组Matlab提供的接⼝函数,⽀持C/C++语⾔,Matlab Engine采⽤C/S(客户机/服务器)模式,Matlab作为后台服务器,⽽C/C++程序作为前台客户机,向Matlab Engine传递执⾏命令和数据信息,从Matlab Engine接收执⾏结果。

⽤户可以在前台应⽤程序中调⽤这些接⼝函数,实现对Matlab Engine的控制。

采⽤这种⽅法⼏乎能利⽤Matlab全部功能,但是需要在机器上安装Matlab软件,缺点是执⾏效率较低。

下⾯简单介绍下这种⽅式的实现步骤:1.1 API接⼝介绍先来介绍⼀组Matlab提供的引擎API接⼝:(仅作简单功能介绍,详细参数说明请参考Matlab帮助)Engine* engOpen(const char* startcmd)启动Matlab引擎int engClose(Engine* ep) 关闭Matlab引擎int engEvalString(Engine* ep, const char* string)执⾏Matlab表达式mxArray* engGetArray(Engine* ep, const char* name)获取⼀个变量数组的值int engPutArray(engine* ep, const mxArray* mp)设置⼀个变量数组的值int engPutVariable(Engine *ep, const char *name, const mxArray *pm)同上mxArray *engGetVariable(Engine *ep, const char *name)获取⼀个变量int engOutputBuffer(Engine* eP,char* p,int n)获取输出字符串1.2 VC环境配置要想在VC集成环境下调⽤Matlab引擎实现VC和Matlab的混合编程,⼀般需要经过以下⼏个必要的步骤:(以下以Matlab2008a和VS2005版本为例)(1)添加include路径:将“\extern\include”(在Matlab的安装路径下)路劲添加到VC编译器的include下(2)添加lib路径:将“\extern \lib\win32\microsoft” (在Matlab的安装路径下) 路径添加到VC编译器的lib下(3)加载lib:需要加载⾄少libmx.lib、libmat.lib、libeng.lib三个库(4)include头⽂件:在要使⽤ engine 函数的地⽅包含engine.h头⽂件1.3 引擎调⽤接下来就可以在VC中调⽤Matlab引擎了,简单的⽰例代码如下:#include "engine.h"#pragma comment(lib, "libeng.lib")#pragma comment(lib, "libmx.lib")#pragma comment(lib, "libmat.lib")void TestDeno(){Engine* pEng = NULL;if (!(pEng = engOpen(NULL))){printf("Open matlab enging fail!");return;}//call Engine plot A*sin(t)+B A=2 B=1mxArray *A = NULL;double init = 2;A = mxCreateDoubleMatrix(1, 1, mxREAL);memcpy((void*) mxGetPr(A), (void*)&init, sizeof (double));engPutVariable(pEng, "A", A);init = 1;memcpy((void*) mxGetPr(A), (void*)&init, sizeof (double));engPutVariable(pEng, "B", A);mxDestroyArray(A);Sleep(3*60*1000);engEvalString(pEng, "t=0:0.2:7;plot(t,A*sin(t)+B);");if(NULL != pEng){engClose(pEng);}}⽰例代码通过VC调⽤Matlab引擎,绘制正弦曲线,相对简单,就不再详细解释,效图如下:2. VC调⽤Matlab DLL的⽅式DLL是⼀个可执⾏的⼆进制⽂件。

C语言环境中调用Matlab程序指南

C语言环境中调用Matlab程序指南

C语言环境中调用Matlab程序指南甄梓宁znzhen@Matlab在计算方面功能强大、编写简单,但是要运行Matlab程序必须装有Matlab并且用户界面也不够完善,因此除了计算的其他部分采用C等更规范完备的语言进行编写是较好的选择。

本文就对如何在C程序中调用Matlab程序作说明。

在C程序中调用Matlab程序有两大类方法。

第一种是调用Matlab引擎,第二种是将m文件打包成dll文件在C语言环境下调用。

前者虽然易于实现,可以实时监控程序的运行,但是独立性差,需要安装完整版Matlab,且每次调用都会启动MATLAB.exe进程;后者则实现复杂,调试麻烦,但只需安装MCR(Matlab Component Runtime),耗费资源较少。

关于MCR,请见第四章的说明。

至于两种方法需要在C环境中如何配置请见第五章。

而反过来若要在Matlab下调用C程序则一般使用Matlab自带的mex工具,在此不作介绍。

一、调用Matlab引擎调用Matlab引擎可以在WIN32、MFC中使用,它的原理实际上相当于打开一个精简版的Matlab然后往里面输命令。

下面是调用Matlab中的加法程序add.m的例子。

先在Matlab的work目录下创建add.m文件并编写程序如下:function s = add (a, b)s = a+b;在C程序中,首先打开精简版的Matlab:(所需头文件,引用库等见第五章)Engine *ep = engOpen (NULL);编译运行后,会自动打开一个命令行监控窗口,输入pwd就可以看到当前的工作目录,于是需要先将工作目录转换至存放add.m的目录:engEvalString (ep, ”cd ..\\..\\work”);engEvalString是往Matlab里输命令的函数,显然我们的目标是成功运行:engEvalString (ep, ”s=add(a,b)”);当然,目前Matlab中并没有a和b两个变量,因此需要在C中初始化这两个变量并转换成Matlab基本变量类型mxArray,才能将它们输入到Matlab中。

Matlab与C混合编程的方法研究与实现毕业论文

Matlab与C混合编程的方法研究与实现毕业论文

Matlab与C混合编程的方法研究与实现摘要:文章探讨了MATLAB与VC++的优缺点,介绍了VC++与Matlab混合编程的几种方法。

通过二者的结合,既有效地利用了MATLAB强大的数值计算能力和众多的函数,大大减少程序设计的工作量,又继承了VC++良好的程序界面,证明是一种很好的程序设计方法。

具体说明了如何应用Matlab引擎实现混合编程以及如何利用MATCOM进行MATLAB和VC++混合编程,并将两种方法用于数字图像处理。

关键词:MATLAB;VC++;MATCOM;引擎;混合编程;图像处理一、引言1、数字图像处理简介:图像技术由高到低分为三个层次:图像处理、图像分析和图像理解。

图像处理是比较底层的操作,它主要在图像像素级上进行处理,处理的数据量非常大。

数字图像处理最基本的目的就是改善图像,主要是按需要进行适当的变换突出某些有用的信息,去除或消弱无用的信息,如改变图像的对比度,去除噪声或强调边缘的处理等,其基本方法有:直方图修正、灰度变换、图像的频域特性、图像平滑、图像锐化等。

直方图是图像的重要统计特征,是表示数字图像中每一灰度级与该灰度级出现的频率数间的统计关系。

直方图能给出该图像的大致描述,如灰度范围、灰度级的分布、整幅图像的平均亮度等,但它不能完整地描述一幅图像。

通常用横坐标表示灰度级,纵坐标表示频数。

通常一幅均匀量化的自然图像由于其灰度直方图分布集中在较窄的低值灰度区间,引起图像的细节看不清楚,为使图像变得清晰,我们可以通过变换使图像的灰度范围拉开或使灰度分布在动态范围内趋于均匀化,从而增加反差,使图像的细节清晰,达到图像增强的目的。

灰度变换是图像增强的一种重要手段,它可以使图像动态范围加大,使图像对比度扩展,图像更加清晰,特征更加明显。

灰度变换可分为线性、分段线性、非线性以及其他的灰度变换。

线性灰度变换实际上使曝光不充分的图像中黑的部分更黑,白的部分更白,从而提高对比度。

图像中的边缘或者线条部分与图像频谱中的高频成分相对应,因此采用高通滤波的方法让高频分量顺利通过,使低频分量受到抑制,就可以增强高频的成分,使图像的边缘或者线条变得清晰,实现图像的锐化。

VC++调用Matlab引擎(engine)配置方法

VC++调用Matlab引擎(engine)配置方法

如何在C/C++语言里调用Matlab引擎(engine)——(上篇)windows下的Visual C++平台Windows下调用Matlab引擎要做好以下三点设置(1)设置头文件目录(2)设置库文件目录,并添加链接库输入项libeng.lib和libmx.lib(3)设置环境变量以下以Visual Studio 2008为例来说明如何设置这三点:1、添加头文件目录依次选择:“工具”->“选项”,调出对话框后再在对话框左边“选择项目和解决方案”->“VC++目录”然后在右边选择“显示以下内容的目录”下的选框选择“包含文件”,再在目录列表的最下边空行处选中添加:matlab安装目录下的\extern\include路径比如我的是:C:\Program Files\MATLAB\R2011a\extern\include如果现在生成项目,链接将不会通过,比如可能会出现:1>engwindemo.obj : error LNK2019: 无法解析的外部符号_mxDestroyArray,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_mxGetPi,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engClose,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engGetVariable,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engOutputBuffer,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engEvalString,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engPutVariable,该符号在函数_WinMain@16 中被引用等链接错误;这就需要设置下面的库文件目录2、添加库文件目录在刚才调出来的对话框中,设置库目录:选择“显示以下内容的目录”下的选框选择“库文件”添加matlab目录下的C:\Program Files\MATLAB\R2011a\extern\lib\win32\microsoft注意:如果是项目要生成的是64位程序那么应该选择的是C:\Program Files\MATLAB\R2011a\extern\lib\win64\microsoft点击确定退出对话框,然后给项目添加链接库输入项:在解决方案资源管理器里选择对应的项目单机右键选择最下面的“属性”弹出属性对话框,在右边依次选择“配置属性”->“链接器”->“输入”,然后在右边“附加依赖项”那一项加上libeng.lib libmx.liblibmat.lib单击确定退出注意:(1)不要删除原有的依赖项(2)依赖项之间用空格隔开做到这一步时生成时就没问题出现了,但是运行程序时会出现“因为计算机中丢失libeng.dll”等类似问题第(3)步就解决这个问题的。

Visual-C#与Matlab混合编程示例(含代码)

Visual-C#与Matlab混合编程示例(含代码)

Visual C# 与Matlab 混合编程由于Visual C# 与Matlab 混合编程的资料并不多,本文通过一个实例来阐述Visual C# 与Matlab 混合编程的方法。

一、混合编程的 4 种方式1. 通过从Matlab的*m文件中生成C语言版本的DLL1) 在Matlab中写好m文件;2) 使用Matlab的编译器,编译为C#能识别的DLL文件;3) 建立C#工程,在工程中引用上一步生成的文件;2. C#调用Matlab工作区计算并返回结果主要使用engOpen, engClose, engPutVariable, engEvalString, engGetVariable 函数进行操作。

大致过程如下:MatlabCSharp.engPutVariable(ep, "ml_a", mx_a);MatlabCSharp.engPutVariable(ep, "ml_b", mx_b);MatlabCSharp.engEvalString( ep, "ml_c = ml_a + ml_b ;" ); mx_c = MatlabCSharp.engGetVariable(ep, "ml_c" );3. 使用Matlab DeployTool 生成COM 组件1) 单击菜单New Deployment Project -> MATLAB Builder NE -> Generic COM Component2) 添加相应的M 文件3) 保存,编译4) 新建C#工程,引用生成的DLL文件。

4. 使用Matlab DeployTool 生成.Net 组件1) 单击菜单New Deployment Project -> MATLAB Builder NE -> .Net Component2) 添加相应的M 文件3) 保存,编译4) 新建C# 工程,引用生成的DLL 文件。

VisualStudio与Matlab实现混合编程

VisualStudio与Matlab实现混合编程

VisualStudio与Matlab实现混合编程环境:Win10vs2010Matlab2015⾥⾯有很多选做的内容,其中2、3必做1.Matlab环境设置:(选做)我没有做这步,因为打mbuild -setup指令不识别,缺少SDK,但是可以正常调⽤Matlab,这步是其他⽅式调⽤Matlab中的⼀步,使⽤Matlab⽣成DLL⽂件,VS引⽤要建⽴独⽴运⾏的C应⽤程序,系统中需要安装Matlab、Matlab编译器、C/C++编译器以及Matlab C/C++数学库函数和图形库函数。

Matlab编译器使⽤mbuild命令可以直接将C/C++源代码编译为独⽴运⾏程序,在这些源代码中可以使⽤Matlab提供的接⼝来调⽤Matlab数学库函数。

虽然⽣成的可执⾏程序可以脱离Matlab环境运⾏,但是它需要Matlab C/C++数学库⽂件或者图形库⽂件的⽀持才能运⾏。

但如果C/C++源代码完全是按传统C/C++源代码语法规则编写,没有包含Matlab数学库和图形库的调⽤,则不仅可以独⽴与Matlab环境,也不需要那两个库函数的⽀持。

在 Matlab 的Command Window 下输⼊命令。

mbuild – setup操作过程如下图:然后输⼊命令mex – setup以类似的⽅法配置编译器。

Matlab 的配置完成。

2.VS环境设置(必做)(1)设置Include 和Library ⽬录项⽬右键->属性->VC++⽬录->包含⽬录:添加<MATLAB>\R2010b\extern\include\win64 我的是:D:\RUANJIAN\Matlab\extern\include\win64<MATLAB>\R2010b\extern\include\ 我的是:D:\RUANJIAN\Matlab\extern\include项⽬右键->属性->VC++⽬录->库⽬录:添加<MATLAB>\R2010b\extern\lib\win32\microsoft 我的是:D:\RUANJIAN\Matlab\extern\lib\win64\microsoft<MATLAB>\R2010b\extern\lib\win64\microsoft截图::(2)设置⼯程⽬录: ( 我并没有设置)项⽬右键->属性->C/C++->常规->附件包含⽬录:添加<MATLAB>\R2010b\extern\include\win64<MATLAB>\R2010b\extern\include\项⽬右键->属性->链接器->常规:添加<MATLAB>\R2010b\extern\lib\win32\microsoft<MATLAB>\R2010b\extern\lib\win64\microsoft项⽬右键->属性->链接器->输⼊->附件依赖性:添加 (必做)libeng.liblibmat.liblibmex.liblibmx.lib 注:1.lib⽂件包含在<MATLAB>\R2010b\extern\lib\win64\microsoft,可根据需要增减 2.附件依赖性在VS2010前以空格隔开,在VS2010后使⽤;隔开。

使用VC调用matlab_engine编程

使用VC调用matlab_engine编程

关于如何使用VC调用matlab engine编程刚开始学使用VC调用matlab engine编程的时候,遇到很多问题,就去百度找解决方法,但发现根本解决不了我的问题,因为网上大部分实例和步骤都是在matlab6.5和vc++6.0环境下完成的,但是现在我用的是matlab2010a,所以会出现很多环境配置的问题,写本文的目的是总结用我在用VC调用matlab engine编程过程中出现的问题和解决办法。

Matlab Engine 采用Client/Server的方式,通过ActivcX通道和Matlab接口来实现在VC编程环境中直接调用matlab中的指令。

调用使用的函数是:engEvalSting。

下面是自己的实践过程:如果是第一次使用,则要设置一下Visual C++6.0 编程环境中的include 和lib的路径指向。

我的matlab2010安装在D盘目录D:\MATLAB 2010一、设置VC相关属性。

(1)Visual C++6.0 编译环境的设置:通过菜单 Tools/ Options,打开Visual C++6.0设置属性页,进入 Directorie页面,在 Show Directories for 下拉列表中选择Include Files,添加路径:D:\MATLAB 2010\extern\include (这是我电脑中Matlab的安装路径);再选择下拉列表中的 Library Files,添加路径:D:\MATLAB 2010\extern\lib\win32\microsoft(我电脑中Matlab 的安装路径,但是在我查看资料的时候看到很多是D:\MATLAB2010\extern\lib\win32\microsoft\msvc60这个路径,但是我用的是MatlabR2010a,msvc60是matlab6.5老版本才有的,10.0版本没有这个文件,所以我们把路径设到D:\MATLAB 2010\extern\lib\win32\microsoft 就可以了)。

MATLAB与VC混合编程配置设置

MATLAB与VC混合编程配置设置

MATLAB与VC混合编程相关配置的设置MATLAB与VC的混合编程中,需要对电脑的“环境变量”和VC的“环境配置”进行设置,然后才可以进行程序的调用。

(1)电脑中“环境变量”的设置:对于win10系统控制面板→系统→高级系统设置→环境变量→系统变量→path中添加D:\softwares\MATLAB\ bin\win64,该路径是MATLAB中dll文件的路径,在path 中添加该路径的目的是让VC在运营时能够读取dll文件。

否则VC在运行时可能会出现“计算机丢失**.dll文件”的情况。

对于win7系统的“环境变量”设置,同样是在path中进行的。

(2)VC的环境配置首先需要建立一个新项目,如MyAdd.cpp。

项目→MyAdd属性→VC++目录→包含目录→D:\softwares\MATLAB \extern\include;项目→MyAdd属性→VC++目录→库目录→D:\softwares\MATLAB\installation document\extern\lib\win64\microsoft。

C/C++→常规→附加包含目录→D:\softwares\MATLAB \extern\include;C/C++→常规→调试信息格式→程序数据库(/Zi);链接器→常规→启用增量链接→是(/INCREMENTAL);链接器→常规→附加库目录→D:\softwares\MATLAB\ extern\lib\win64\microsoft;链接器→输入→附加依赖项→libMyAdd.lib,mclmcrrt.lib,libmx.lib,libmat.lib,mclmcr.lib。

其中在输入时这些lib之间用回车换行。

上述步骤的工作界面如下所示:需要注意:在进行VC与MATLAB混合编程的过程中,用到的环境是32位还是64位,在这里需要是相同的编程环境才可以相互调用,如:上图中如果是x32,则需要点击“配置管理器”进行重新设置。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VC++与Matlab混合编程之引擎操作详解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控件方式启动的。

在Matl ab初次安装时,会自动执行一次:matlab /regserver将自己在系统的控件库中注册。

如果因为特殊原因,无法打开Matlab引擎,可以在Do s命令提示符后执行上述命令,重新注册。

2. 配置编译器要在VC中成功编译Matlab引擎程序,必须包含引擎头文件engine.h并引入Matlab对应的库文件libmx.lib、libmat.lib、libeng.lib。

具体的说,打开一个工程后,做如下设置(以VC6为例):1) 通过菜单工程/选项,打开设置属性页,进入Directories页面,在目录下拉列表框中选择Include files,添加路径:"C:\matlab\extern\include"(假定matlab安装在C:\matlab目录)。

2) 选择Library files,添加路径:C:\matlab\extern\lib\win32\microsoft\msvc60。

3) 通过菜单工程/设置,打开工程设置属性页,进入Link页面,在Object/library modu les编辑框中,添加文件名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操作系统中只能为N ULL。

函数返回值是一个Engine类型的指针,它是在engine.h中定义的engine数据结构。

EngClose-关闭Matlab 引擎函数声明:int engClose(Engine *ep);参数ep代表要被关闭的引擎指针。

函数返回值为0表示关闭成功,返回1表示发生错误。

例如,通常用来打开/关闭Matlab引擎的代码如下:Engine *ep; //定义Matlab引擎指针。

if (!(ep=engOpen(NULL))) //测试是否启动Matlab引擎成功。

{MessageBox("Can't 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, N ULL, 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的a rray类型和几个常用的mxArray函数即可。

在VC中,所有和Matlab的数据交互都是通过mxArray来实现的,在使用mxArray类型的程序中,应包含头文件matrix.h,不过在引擎程序中,一般会包含头文件engine.h,该文件里面已经包含了matrix.h,因此无需重复包含。

4.1 创建和清除mxArray型数据Matlab有很多种变量类型,对应于每种类型,基本上都有一个函数用于创建,但它们都有相同的数据结构,就是mxArray。

数组的建立采用mxCreatexxx形式的函数,例如新建一个double类型数组,可用函数m xCreateDoubleMatrix,函数形式如下: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函数。

其中mx GetM用来获得数组第一维的元素个数,对于矩阵来说就是行数。

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数组中返回。

相关文档
最新文档