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

合集下载

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

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

VC++与Matlab混合编程之引擎操作详解课题需要生成多通道的电压信号,即通过激光接收器转换而成的电信号,然后通过数据采集卡进行向外传输,故想到在传输之前可以将数据以波形的方式显示出来,由于在vc中画图还是比较麻烦的,所以想到用vc调用matlab引擎然后画图,上网一搜这方面的信息还是很多的,不过不好的地方是不能脱离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命令。

VS(VC)与Matlab联合编程步骤

VS(VC)与Matlab联合编程步骤

联合编程的操作步骤首先,我先说一下我所安装的环境,我的电脑是Win7(X64)的,我安装的Matlab是Matlab R2010b和VS2010,还有Matcom4.5我Matlab的安装目录:C:\Program Files\MATLAB我VS的安装目录:F:\Program Files (x86)\Microsoft Visual Studio 10.0一、Matlab环境配置在Matlab的Command Windows下输入命令:mbuild -setup然后输入命令:mex–setup 方法同上mbuild–setup一样。

在Matlab中编写想要实现的.m文件。

我以最简单的.m文件为例:function [c]=Myadd(a,b)c=a+b;在命令窗口编写:会在当前目录下生成如下图中显示的文件:其中重点会用到的是.cpp、.h、,dll、.lib文件。

在头文件的最后,你可以看到下面的内容:externLIB_myadd_CPP_API void MW_CALL_CONV myadd(intnargout, mwArray& c, constmwArray& a, constmwArray& b);这就是myadd的C函数的声明。

nargout表示输出变量的个数,其他就是对应了m函数的几个变量。

二、Matcom设置准备工作在Matcom中编写函数文件:保存后,点击compile to DLL,生成DLL文件默认在matcom安装目录debug 文件夹下面。

会生成如下图所示的文件:主要用到的还是.dll、.h、.lib等文件。

不过在VS中调用时,需要将matcom安装目录lib文件夹下的matlib.h和v4501.lib拷贝到工程文件夹下。

并且要将翻译生产的文件(.dll、.h、.lib等文件)也复制粘贴到工程目录下。

且在stdafx.h中要包含matlib.h。

vc++6.0与matlab7.1 混编配置和注意事项

vc++6.0与matlab7.1 混编配置和注意事项

一,配置matlab7.1为了能够使用MA TLAB的Complier将*.m函数文件编译为动态链接库DLL,必须对MATLAB的环境做出相应的设置。

具体做法如下:1.。

在MATLAB的Command Window下输入命令mbuild –setup,并根据MA TLAB的提示选择合适的编译器,笔者使用的是Microsoft Visual C++6.0,进行对C++连接环境的设置。

过程如下:>> mbuild -setupPlease choose your compiler for building standalone MA TLAB applications:Would you like mbuild to locate installed compilers [y]/n? ySelect a compiler:[1] Lcc-win32 C 2.4.1 in D:\PROGRA~1\MATLAB\R2008a\sys\lcc[2] Microsoft Visual C++ 2005 in d:\Program Files\Microsoft Visual Studio 8[3] Microsoft Visual C++ 6.0 in D:\Program Files\Microsoft Visual Studio[0] NoneCompiler: 3Please verify your choices:Compiler: Microsoft Visual C++ 6.0Location: D:\Program Files\Microsoft Visual StudioAre these correct [y]/n? yTrying to update options file:C:\Documents and Settings\hk\Application Data\MathWorks\MATLAB\R2008a\compopts.batFrom template: D:\PROGRA~1\MATLAB\R2008a\bin\win32\mbuildopts\msvc60compp.batDone . . .2.。

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 文件。

使用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(MFC)混合编程(介绍Matcom与Matlab 引擎两种方式)文库

Matlab与VC(MFC)混合编程(介绍Matcom与Matlab 引擎两种方式)文库

本文由wolf1sky贡献doc文档可能在WAP端浏览体验不佳。

建议您优先选择TXT,或下载源文件到本机查看。

Matlab 与 VC 混合编程 1:一、采用 Matcom1、目标1. 测试在 VC 中调用 MatrixC++库,生成矩阵并显示 2. 测试 VC 中调用.m 文件2、步骤2.1 目标 1<1>建立 VC 工程,添加库 v4501v.lib,有两种方法:?向工程中添加文件 v4501v.lib 在 Setting/link 中添加库 v4501v.lib(这样写的前题是 VC 路径设置正确,即在 Options/Directories 中设置,否则请注明详细路径)二者选其一就可以了。

<2> 添加头文件 #include "matlib.h" (这样写的前题是 VC 路径设置正确,即在 Options/Directories 中设置,否则请注明详细路径)建议:最好在工程中把文件 matlib.h 添加进来,方便查看函数详细说明 <3>现在就可以调用 Matrix中的C++函数了,例子如下:// Init matcom initM(MATCOM_VERSION); winaxes(AfxGetMainWnd()->GetSafeHwnd()); Mm a,b; a = (BR(1),2,3,semi,4,5,6,semi,7,8,9); a = transpose(a); b = (BR(1),2,3,semi,4,5,6,semi,7,8,9); m_1.Format("%3f %3f %3f \r\n%3f %3f %3f \r\n%3f %3f %3f \r\n",a.r(1,1),a.r(1,2),a.r(1,3),a.r(2,1),a.r(2,2),a.r(2,3),a.r(3,1),a.r(3,2),a. r(3,3));//m_1 是一个 CEdit 控件 UpdateData(FALSE); exitM();2.2 目标 2<1>首先用 Matlab 调试成功以下两个有依赖关系的.m 文件文件 1:equation.m function y = equation(a,b) y = a * b; 文件 2:CallE.m % function name function [o1,o2] = CallE(x) if (nargin ~= 1) error('arguments must be inputed!'); endif (x == 1) a = reshape(1:9,3,3); elseif (x == 2) a = reshape(11:19,3,3); else error('input error'); end b = magic(3); o1 = equation(a,b); o2 = o1 + 1; <2>将以上两个文件放在同一个目录下,启动 MatCom 编译运行 CallE.m, >> CallE(2) 则在同一目录下生成一个 DEBUG(或者是 Release,在 MatCom 的菜单项 Configuration 中选择)目录下可以找到相应的.cpp 及.h 文件,把它们全部拷贝到 VC 工程目录下,也可以自己建一个文件夹 <3>在 VC 项目中添加这些文件,并在头部添加相应.h 的引用,如下: #include "./matlib/equation.h" #include "./matlib/calle.h" <4>添加调用函数的代码,如下: Mm a,b,c; a = BR(2); 表示输入参数到输出参数的间隔,《MatrixLIB user's 详见calle(a,i_o,b,c); //i_o 是一个间隔符,Guide》m_2.Format("%3f %3f %3f \r\n%3f %3f %3f \r\n%3f \r\n",b.r(1,1),b.r(1,2),b.r(1,3),b.r(2,1),b.r(2,2),b.r(2,3),b.r(3,1),b.r(3,2),b. r(3,3)); %3f %3fUpdateData(FALSE);3、遇到的问题及解决方案<1>当在 VC 工程中添加由 Matcom 转换的 cpp 及 h 文件后,注:如果在编译中出现下列错误:fatal error C1010: unexpected end of file while looking for precompiled headerdirective 解决:进行下列设置:工程->设置-> C/C++ 选择 precompiled headers 选解决:择第一或第二项:自动选择预补偿页眉,如图:<2>使用Matcom 后,生成Debug 版没问题,而生成Release 时链接出错,nafxcw.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMT.lib(delete.obj) 解决:解决:将"Project 属性" -> "C/C++" -> "代码生成(codegeneration)" -> "运行时库(run-time library)" 项下修改应用程序的默认标准库版本,我修改成 Debug Multithreads 就可以了,原因是安装Matcom 时库为调试版<3>在其它机器上运行出错解决:解决:将 ago4501.dll v4501v.dll glu32.dll opengl32.dll 附带发布即可 <4>关闭程序后进程没有退出解决:解决:添加语句winaxes(m_hWnd);参考文献1、何东健等.《数字图像处理》.西安电子科技大学出版社.20032、邓科.浅析 VC 与matlab 接口编程(一). VC 知识库,41 期3、邓科.浅析 VC 与 matlab 接口编程(二). VC 知识库,42 期4、Matcom 参考手册Matlab 与 VC 混合编程 2:二、通过 Matlab 引擎与 VC 混合编程--飞狼编程宝典--明明知道选择你是一个错误,却为何那么地坚持这个错误……基于 Matlab 引擎的混合编程方式无法脱离 Matlab 环境,却为何还要使用它?根据本人的实践,对于一般应用,如矩阵运算,图像操作等,使用 Matcom 就已经足够,而且能够脱离 Matlab 那个巨大的环境而独立运行,但是,对于很多好用的 Matlab 工具箱,我们却无法直接在 VC 中调用。

使用MATLAB Engine与C混合编程

使用MATLAB Engine与C混合编程

使用MATLAB Engine实现与C混合编程(五)引擎应用程序1、简介引擎应用程序的实质是把MATLAB做为一个引擎,它允许从你自己的C++程序调用这个引擎。

在运行时,引擎作为一个进程单独运行,你的C++程序也作为一个进程单独运行,二者可以通过进程间的通信机制进行交互。

2、引擎库MATLAB引擎库包含了若干个控制MATLAB引擎的函数,如下所示:engOpen 启动MATLAB引擎engClose 关闭MATLAB引擎engGetArray 从MATLAB引擎中获取一个MATLAB矩阵engPutArray 向MATLAB引擎发送一个MA TLAB矩阵engEvalString 执行于一个MATLAB命令engOutputBuffer 创建一个存储MATLAB文本输出的缓冲区同时,引擎应用程序还可以使用前面提到的API函数。

3、一个例子从这个示例中,我们看出引擎应用程序是如何编制的:/** engdemo.c* This is a simple program that illustrates how to call the* MATLAB engine functions from a C program.*/#include#include#include#include "engine.h"#define BUFSIZE 256int main(){Engine *ep;mxArray *T = NULL, *result = NULL;char buffer[BUFSIZE];double time[10] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0,8.0, 9.0 };8.0, 9.0 };6-6/** Start the MATLAB engine locally by executing the string* "matlab".* To start the session on a remote host, use the name of* the host as the string rather than \0* For more complicated cases, use any string with whitespace,* and that string will be executed literally to start MATLAB.*/if (!(ep = engOpen("\0"))) {fprintf(stderr, "\nCan't start MATLAB engine\n");return EXIT_FAILURE;} /*启动MATLAB引擎*//** PART I* For the first half of this demonstration, we will send data* to MATLAB, analyze the data, and plot the result.* Create a variable for our data.*/T = mxCreateDoubleMatrix(1, 10, mxREAL); /*创建一个矩阵*/mxSetName(T, "T"); /*设置矩阵的名字为“T”*/memcpy((void *)mxGetPr(T), (void *)time, sizeof(time)); /*向矩阵“T”赋值*//** 把矩阵“T”置入MATLAB引擎*/engPutArray(ep, T)/** Evaluate a function of time, distance = (1/2)g.*t.^2* (g is the acceleration due to gravity).*/engEvalString(ep, "D = .5.*(–9.8).*T.^2;");/*执行MATLAB 命令:D = .5.*(–9.8).*T.^2;*//** 绘制图象.*/engEvalString(ep, "plot(T,D);"); /*执行MA TLAB命令:绘图*/engEvalString(ep, "title('Position vs. Time for a fallingobject');"); /*执行MATLAB命令:给图象加标题*/engEvalString(ep, "xlabel('Time (seconds)');"); /*执行MATLAB命令:设置X轴坐标*/ engEvalString(ep, "xlabel('Time (seconds)');"); /*执行MATLAB命令:设置X轴坐标*/ engEvalString(ep, "ylabel('Position (meters)');"); /*执行MATLAB命令:设置Y轴坐标*//** Use fgetc() to make sure that we pause long enough to be* able to see the plot.*/printf("Hit return to continue\n\n");fgetc(stdin);/** We're done for Part I! Free memory, close MATLAB engine.*/printf("Done for Part I.\n");mxDestroyArray(T); /*从内存中撤销矩阵“T”*/engEvalString(ep, "close;"); /*关闭刚才显示图象的窗口*//** PART II* For the second half of this demonstration, we will request* a MATLAB string, which should define a variable X. MATLAB* will evaluate the string and create the variable. We* will then recover the variable, and determine its type.*//** Use engOutputBuffer to capture MATLAB output, so we can* echo it back.*/engOutputBuffer(ep, buffer, BUFSIZE); /*构建MATLAB文本输入缓冲区*/while (result == NULL) {char str[BUFSIZE];/** Get a string input from the user.*/printf("Enter a MATLAB command to evaluate. Thiscommand should\n");printf("create a variable X. This program will thendetermine\n");printf("what kind of variable you created.\n");printf("For example: X = 1:5\n");printf(">> "); /*要求用户输入一个MATLAB命令*/fgets(str, BUFSIZE–1, stdin); /*获得用户输入*//** Evaluate input with engEvalString.*/engEvalString(ep, str); /*执行用户输入的MATLAB命令*/engEvalString(ep, str); /*执行用户输入的MATLAB命令*//** Echo the output from the command. First two characters* are always the double prompt (>>).*/printf("%s", buffer+2); /*显示该MATLAB命令的执行情况*//** Get result of computation.*/printf("\nRetrieving X...\n");if ((result = engGetArray(ep,"X")) == NULL)/*判断是否可以从MATLAB 引擎中获得矩阵“X”*/printf("Oops! You didn't create a variable X.\n\n");elseprintf("X is class %s\t\n", mxGetClassName(result));/*显示矩阵“X”的类型*/} /* while(result==NULL)*//** We're done! Free memory, close MATLAB engine and exit.*/printf("Done!\n");mxDestroyArray(result); /*从内存中撤销矩阵“T”*/engClose(ep); /*关闭MATLAB引擎*/return EXIT_SUCCESS; /*返回*/}4、引擎应用程序的编译对于象上例中的控制台程序,可以在MATLAB命令行中直接使用带-f参数的mex命令编译。

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

用VB与MATLAB混合编程方式实现图像处理任少斌1,李元宗21太原理工大学理学院计算机基础教学部,太原 (030024)2太原理工大学机器人研究所,太原 (030024)Email: rsb_long@摘 要:阐述了如何使用MATLAB与VB编程工具相结合的手段开发图像处理研究软件的方法。

以直方图计算的分析为例,用VB与MATLAB 编写程序,实现对直方图特性变化的分析,并给出可视化的结果。

通过一个具体的程序证明VB与MATLAB混合编程可以有效的提高了程序的设计效率。

关键词:VB;MATLAB;DDE;混合编程;图像处理1 引言VB(Visual Basic)由Microsoft公司推出并广泛应用的可视化面向对象编程工具,它功能丰富,简单易学,既是一种编程语言,也是一个强大的集成开发环境。

利用VB能够迅速编制各种风格而且界面良好的软件,它是目前Windows平台上主力编程语言之一。

VB的主要缺点是运算速度慢,不适合进行大型的数值计算和图形处理。

MATLAB是由美国MathWorks公司开发的软件工具,它具有强大的数值运算能力,适用于大量科学与工程计算,具有先进的视觉化功能。

在控制系统、图像处理、信号处理、神经网络等方面有应用广泛。

但MATLAB的是一个命令式交互系统,功能模块比较分散,要求使用者具有较高的计算机应用素质,并且熟悉MATLAB的环境[1]。

2 混合编程概念引入C++是一种传统的被公认为可以用于图像处理的程序设计语言,但面对C++编程过于繁琐和抽象的特点,使很多人对使用它进行程序设计敬而远之。

而MATLAB利用单独函数功能处理图像处理的优势,VB在交互界面设计中的方便灵活的特点,使人们开始尝试将这两种语言相互结合用于图像处理,即混合编程的概念。

MATLAB与VB都是基于Windows环境中的编程平台,其中MABLAB有十分强大的图像处理工具箱,它支持丰富的图像文件格式。

它提供的15 类图像处理函数,涵盖了几乎所有的常见图像处理方法[1]。

利用这些图像处理工具箱,再结合MA TLAB6.5自身的强大数据处理功能,可以不必关心图像文件的格式、读写、显示等细节,而把精力集中在算法研究上,使得工作效率大大提高。

在测试这些算法时既可方便地得到统计数据,同时又可得到直观图示[2],如图3 所示。

VB与MATLAB混合编程的主要思想来自客户机/服务器应用程序开发模式。

随着应用程序开发模块化以及互联网的广泛应用,很多软件系统都提供了这种技术支持。

MATLAB 和VB同时具备这项功能。

实现方式主要有四种。

ActiveX方式、使用MatrixVB、调用DLL 动态链接库和DDE方式。

四种方法各有特点,在很多文献中都有阐述[3]。

其中使用Matrix VB相对简单,不需要额外调用其他函数和文件,但能够用于图像处理的功能有限; 通过DLL 动态链接库,将MATLAB 的函数转换为VB 中可以调用动态链接库,使用ActiveX方式对于设计人员要求较高相应的难度较大;使用DDE方式主要利用剪贴板功能传递数据,相对容易实现。

本文重点介绍使用DDE方式与MATLAB混合编程。

3 动态数据交换DDE(Dynamic Data Exchange)动态数据交换简单的解释,就是采用的是内存共享方式用于给两个不同的程序做通讯工作。

而通讯交换实际上指利用剪贴板在不同应用程序之间传递数据。

Windows支持多进程通信机制,包括Windows剪贴板、动态链接库中的共享内存和ActiveX等。

其中动态数据交换DDE(Dynamic Data Exchange)属多进程通信机制之一。

DDE的功能没有ActiveX强大,但其在使用时比较方便,容易实现[4]的特点。

3.1 DDE传递机理DDE是基于windows的消息机制,两个Windows程序之间可以通过相互传递消息进行“对话”,这两个程序形象地被称为“服务器”和“客户”(如图1所示)。

DDE服务器是一个维护其它Windows程序而使用的数据程序,而DDE客户则是从DDE服务器获得这些数据的程序。

在Windows中的应用程序具有双重身份,它既可以是一个程序的客户,也可以是另一个程序的服务器。

因此在程序设计中需要明确对话环境,当客户发出相应的消息之后,它同时也说明了需要的服务类型。

DDE对话由客户程序发出,客户程序将一条称为WM_DDE_INITIATE的消息发到目前所有运行的Windows程序,它同时指明了客户程序所需要的数据类型,而拥有这些数据的DDE服务器可以响应这条消息并开始对话。

混合编程中的DDE在发出对话的指定了需要响应的服务器是MATLAB。

因此只有MATLAB会根据对话的要求产生动作。

3.2 DDE工作方式当一个客户端的应用程序初始化一个DDE对话时,必须指定两个由服务器定义的DDE 参数:服务器应用程序名称 (service name)和对话主题 (topic)。

如图2所示。

当一个服务器收到一个支持的对话请求后,便接受这个请求,建立一个DDE对话。

一个服务器应用程序和一个对话主题共同构成唯一的对话。

当MATLAB作为客户程序时,它只支持文本格式的数据传输。

它作为服务器时,除支持文本格式外,还可以支持图元文件(MetaFilepict)格式和XLTable格式。

本文的数据传递就是基于图元文件格式进行传递的。

3.2.1 客户和服务的交互过程DDE总是发生在客户应用程序和服务应用程序之间。

DDE客户应用程序通过建立和服务程序的会话来发送事务(transaction)来实现数据交换。

一个事务是对数据或服务的请求。

DDE服务应用程序通过提供数据或服务来响应客户程序的请求。

一个服务程序同时可以和多个客户程序建立会话;一个客户程序也能同时从多个服务程序中获取数据。

一个应用程序即可以是客户程序,也可以是服务程序。

客户或者服务程序都可以在任意时刻结束已经建立的会话。

3.2.2 服务名、主题名和事务名DDE服务器使用三层结构(服务名、主题名和数据项名)来唯一地标识一个在会话中被交换的数据单元。

其中服务名是一个在客户程序试图同服务器建立会话时服务应用程序用来响应的字符串。

为了同服务器建立会话,客户程序必须指定服务名。

虽然一个服务器可以响应多个服务名,但是大多数服务器一般只响应一个服务名。

主题名是一个用来标识逻辑数据上下文的字符串。

对于那些操作基于文件处理的服务器,主题名通常是文件名;其它的则是由应用程序指定的字符串。

除了服务名,一个客户程序如果试图建立一个会话,则必须指定主题名。

数据项名是一个用来标识服务器传递给客户程序的数据单元的字符串。

3.2.3 系统主题系统主题提供了一个让任何DDE客户程序得到感兴趣信息的上下文。

VB在调用MATLAB时指定服务器主题是Topic。

确认由Topic下的数据项对VB的请求产生动作。

3.2.4 建立连接在调用DDE之前首先需要确保它与其它的服务器没有联系,因此客户联接模式为vbLinkNone。

然后再建立与MATLAB的联系MATLAB| Engine。

当一项任务完成之后,需要将建立的联接断开。

释放系统分配给应用程序的资源。

图1描述作为服务器的MATLAB与作为客户的VB之间通信的概念,它们之间的通信载体是其中的DDE模块,VB通过DDE函数将请求发出,MATLAB则通过DDE模块接受相应的对话要求。

图2说明了MATLAB中的对话主题与具体的内容。

图1 MA TLAB服务器原理图图2 MA TLAB DDE结构图MATLAB中的具体数据类型如下:EngEvalString:它表示采用文本内容进行DDE数据交换EngStringResult:它表示将执行的结果回传到客户。

EngFigureResult:它表示将运行结果中的图形内容通过剪贴板回传客户。

mxtrix name:它表示将运算的结果通过矩阵方式传递给客户。

在具体的实现过程中,客户需要根据需要建立与MATLAB的联系,并分别指定不同的传递内容。

MATLAB将运算的结果分别以不同方式交给客户。

DDE使用剪贴板在应用程序间交换不同格式的数据,在MATLAB的引擎主题中通过使用文本格式数据的EngStringResult项,用户可以请求DDE执行命令的字符串结果;通过EngFigureResult项可以配合两种格式的数据使用,即文本格式与图元格式。

当使用文本格式的数据时如果返回的字符串为“yes”,则表示当前图形元文件已经存放于剪贴板中,如果返回的是“no”表示剪贴板中没有相关内容。

具体实现过程如下MATLAB的Engine 主题对3 种客户端应用程序中可能的DDE 操作提供了支持,这些操作包括发送命令到MATLAB中执行以及从MATLAB中请求数据和向MATLAB发送数据。

以文本框1(TextInput)传递数据,文本框2(TextOutput)接收数据为例说明如表1如示:表1 MA TLAB接收指令说明代码说明Text Input . LinkMode = vbLinkNone 断开传递参数的控件与其它所有DDE有连接Text Input . LinkTopic =“MA TLAB| Engine”连接对象(输入控件)到MA TLABText Input . LinkItem =“EngEvalString”确定连接传递参数的格式是文本格式Text Input . LinkMode = vbLinkManual 建立与MA TLAB的连接szCommand = Text Input . TextText Input . LinkExecute szCommand 将VB的内容传递到MA TLAB可以执行的参数szCommand中,并执行该指令Text Input . LinkMode = vbLinkNone 断开传递参数的控件与其它所有DDE有连接TextOutput . LinkMode = vbLinkNone 断开接收参数的控件与其它所有DDE有连接TextOutput . LinkTopic =“MA TLAB| Engine”连接对象(输出控件)到MA TLABTextOutput . LinkItem =“EngStringResult”确定接收参数的格式是文本格式TextOutput . LinkMode = vbLinkManual 建立与MA TLAB的连接TextOutput . LinkRequest 接收结果TextOutput . LinkMode = vbLinkNone 断开传递参数的控件与其它所有DDE有连接4 直方图功能直方图用来描述图像的每个灰度值(0~255)的统计值图形,它表征某个灰度值出现的概率。

相关文档
最新文档