VC++与Matlab混合编程之引擎操作详解.pdf
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联合编程步骤

联合编程的操作步骤首先,我先说一下我所安装的环境,我的电脑是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 混编配置和注意事项

一,配置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)配置方法

如何在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 混合编程的方法。
一、混合编程的 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编程的时候,遇到很多问题,就去百度找解决方法,但发现根本解决不了我的问题,因为网上大部分实例和步骤都是在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 引擎两种方式)文库

本文由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混合编程(五)引擎应用程序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命令编译。
Matlab与VC混合编程

浅析VC与matlab接口编程(一)作者:孙科QQ:44760299邮箱:c_dinco@Matcom是mathTools公司推出的一个能将M文件转化成相同功能C++代码的工具。
相比Matlab自带的编译器Compiler,用Matcom转化代码要简单和方便得多。
本文将结合作者编程经验,以VC6.0和Matcom为例,详细介绍如何利用Matcom进行VC与Matlab的联合编程。
Matcom安装安装Matcom前要已求安装VC6.0。
在安装过程中出现选择编译器对话框,选择“是”(图一)。
出现选择是否安装Matlab时,选“否”。
其他选项采用默认设置。
Matcom可以独立于Matlab运行,但需要外部的C++编译器,指定Matlab的位置是为了让编译文件中需要的一些系统函数找到路径用的。
图一安装完成后,启动界面MIDEVA(图二)。
MIDEVA集成开发环境包括命令行窗口、变量列表窗口、命令列表窗口和编译链接信息窗口等几部分,并有详细的帮助文档。
图二Matcom命令输入方法与Matlab相同。
如果安装在中文版操作系统时,输入命令前加一空格。
(如图三)。
图三下面详细介绍如何将m文件编译后放入VC中。
1、启动MIDEVA ,File->New,新建如下Test1.m文件:x=1:0.1:10; y=sin(x); plot(x,y);将文件保存(如图四)。
图四m文件保存的默认位置为:matcom安装目录\matcom45,生成的C++文件保存的默认位置为:matcom安装目录\matcom45\Debug\,本例matcom安装目录为C盘即 C:\matcom45\Debug\,在该目录下将会产生Test1.h、Test1.cpp、Test1.r 、Test1.obj文件。
2、在VC中用MFC Wizard(exe)创建一个基于对话框名为Example的工程。
在面板上添加一个ID为IDC_BUTTON1按扭。
matlab和VC混合编程综述

程序中使用MATLAB编译产生的DLL (VS2005, MATLAB 7.5, mwArray)2007-12-16 14:52:39| 分类:MatLab/Maple/Mat|字号订阅from: /forum/thread-801187-1-1.html程序中使用MATLAB编译产生的DLL (VS2005, MATLAB7.5, mwArray)最近有几个帖子都在讨论有关在C++程序中使用MATLAB编译产生的动态链接库DLL。
本来想用原来帖子中给出的m代码作为例子,无奈那段代码其实无法执行。
为了避免分散注意力,也为了更好地讨论问题,于是决定还是另外新开一个主题,以简单的例子,和大家一起讨论如何在C++程序中使用matlab编译产生的DLL。
同时MATLAB最新版本R2007b刚刚发布不久,其中包含编译器4.7版,有了一些新的特性,于是也借这个例子来验证一下相关的技术有没有发生大的变化。
最近讨论的问题是关于在C++程序中调用MATLAB编译产生的动态链接库。
具体的问题是在调用DLL中函数时传递参数。
我们知道,MATLAB可以把m代码编译成两种DLL,分别是C语言接口和C++语言接口的DLL。
论坛上的问题是关于调用C++接口的DLL中的函数,所以这里我们就以这种DLL为例来介绍。
在C++接口的DLL中,函数的输入、输出参数都是mwArray对象。
所以问题归结为如何在C++程序中使用mwArray。
这个问题本来可以只用一个简单的C++程序来练习,而不需要MATLAB编译的DLL。
不过为了模拟实际情况,选择以一个更为接近实际的m代码作为例子。
在这个例子中,输入输出都是矩阵,至于标量,它也是一个一行、一列的矩阵。
实验环境:Windows 2003 Std Server with SP2 (En),MATLAB R2007b,Visual Studio 2005。
MATLAB安装路径:h:MATLABR2007b。
matlab与C++混合编程步骤详解

matlab与C++混合编程步骤详解MATLAB文件变为C/C++文件混合编程1 使用MATLAB 自带的MATLAB COMPILERMATLAB Compiler 是MATLAB自带的一个编译器,它能将m文件转化成C、C++或p等各种类型的源代码,并根据需要生成可执行文件、lib文件(库文件)、dll文件或S函数文件等。
Matlab所使用的编译器包括了MATLAB 的C\C++数学库函数以及图形库。
必须保证编译器的正确配置,因为编译器使用了C\C++库函数,所以在使用前需要使用mex -setup 和 mbuild -setup两个命令对编译器进行配置。
步骤如下:1. 设置Matlab的编译器,使用外部的VC或者gcc等编译器。
2. 编译m文件成dll3. 设置VC等的继承环境,设置C需要用到的静态库和动态库4. 编写C调用dll1.1设置MATLAB编译器首先要安装Matlab 编译器,一般来说,在安装了Matlab后编译器就己经安装了,所在就只需要对Matlab编译器进行设置。
1.1.1 编译环境设置首先设置系统的环境变量,点击“我的电脑”属性-→系统特性--→高级-→环境变量-→添加系统变量Matlab值为Matlab的安装路径:G:\matlab7.0\bin\win32,重启电脑即可。
1.1.2 MATLAB7.0 编译器设置(a) 为编译后产生的MEX文件进行预配置在Matlab 的命令窗口(Command Window) 键入“mex -setup ”命令后,按回车键,安装Matlab 编译器;(b) 为产生独立外部应用程序进行预配置对Matlab编译器mbuild应用程序进行设置,运行Matlab ,在Matlab 的命令窗口(Command Window) 键入“mbuild -setup ”命令后,按回车键,安装Matlab 编译器;1.2 将MATLAB函数转成DLL函数在Matlab的Command Window /下输入命令:命令 1 :mcc -W lib:dlltest -T link:lib huatu_test.m或命令 2 :mcc -W cpplib: dlltest -T link:lib huatu_test.m命令1生成的是C,命令2生产的是C++。
matlab与vc混编

matlab与vc混编matlab与vc混编-概述篇--转贴自pris学术论坛第一章、详述...第一章、概述matlab就是当今世界上采用最为广为的数学软件,它具备相当强悍的数值排序、数据处理、系统分析、图形表明,甚至符号运算功能,就是一个完备的数学平台,在这个平台上,你只需寥寥数语就可以顺利完成十分复杂的功能,大大提高了工程分析排序的效率。
另外由于matlab的广为采用,于是发生了向各个领域专门采用的工具箱(即为在某一研究领域常用数学工具的函数纸盒),这些工具箱的发生更加推动了matlab的盛行。
matlab强大的功能只能在它所提供的平台上才能使用,也就是说,你必需在安装有matlab系统的机器上采用.m文件,这样就给工程排序增添了非常大不便;特别就是,在matlab中,并使用的行解释方式执行代码,这样大大地限制了代码执行速度。
于是人们想到,能否开发一个matlab与其他高级语言的USB,这样就可以把matlab的强悍功能带入各种应用程序中,并且通过高级语言编译器编译为2进制代码,从而大大提高了执行速度。
1.用matlab的mcc将.m文件翻译为cpp源文件,然后在c编译器中调用也可以用mcc编程编程为stand-alone程序。
是我最喜欢用的方法。
方法1和2/3各有利弊,1不积极支持图形(积极支持图形的库国内现在还没d),1对类积极支持也比较,2积极支持绝大多数的matlab语句(包含图形),但对于struct等的积极支持也有缺陷。
vc++中使用matlab的c++数学库和mcc生成的程序0、概述matlab5.3的提供了c/c++数学库,其中的c++数学库功能很强,使用它可以用类似matlab的语法编写c++程序,十分方便。
虽然速度上仍然比手工c/c++程序慢,但是由此换来的高效的开发效率和可靠性往往是值得的。
另外mcc命令可以将m文件转化为c或cpp文件,编译后可以脱离matlab运行,它们也是使用的c/c++数学库。
(整理)详细讲解基于COM组件的VC和MATLAB混合编程

基于com组件的VC和MATLAB混合编程一、MATLAB 下做COM组件由于MATLAB 的编译器只能对函数M文件进行编译, 所以如果原来的程序是脚本程序应改写成函数形式。
同一个M文件还可以包含多个函数, 此时将出现在文件中的第一个M函数称为主函数, 其余的函数称为子函数, M函数文件的名称一般与主函数的名称保持一致, 其它函数都必须按照函数的基本结构来书写, 例如建立一个M函数文件function [a]=msadd(x,y)a=x+y;保存文件名为msadd.m在MA TLAB 命令行中输入deploytool命令启动MATLAB Com Builder 图形用户界面, 在其文件菜单中选择File- >New Project点击最左上角新建一个工程:注意:工程保存路径最好在硬盘一级目录下,工程名尽量简单,不要超过8个字母。
新建一个M3add的工程在D盘下系统生成一个M3add.prj的文件和一个名为M3add的文件夹工程建好后,系统自动生成一个与工程名相同的类,下图中为M3add的文件夹,这个文件夹经编译后,导入VC就是一个类,注意:这里要把与工程名相同的类删除再增加一个不同名的类,或改名,总之工程名与类名不能相同,否则导入VC后,最后编译时会报错,overload 之类的。
这里新增加了一个M4add类,在这个类下面增加m函数文件。
注意:如果是神经网络,则只能是训练好的神经网络。
函数中最好不要用图形显示的语句。
图形显示和VC的交互更加复杂,这里暂不讨论。
然后编译:编译完成后,关闭Matlab。
Matlab的工作到此完成。
二、设置VC++1、准备文件:(1)如果未曾对mwcomutil.dll 进行过注册, 在系统开始->运行中输入cmd,则进入DOS 在Dos状态下输入regsvr32 mwcomutil.dll对其进行注册,mwcomutil.dll在<MA TLAB 目录>/bin/win32 下。
Vc调用matlab导出的dll,实现vc与matlab混合编程

软件英才网软件行业驰名招聘网站Vc调用matlab导出的dll,实现vc与matlab混合编程Vc调用matlab导出的dll,实现vc与matlab混合编程写这篇博客的目的就是想把前段时间的工作交接下,让后来人接手这个项目的人迅速的入门。
文章虽短,在项目初期可是搜刮了很多资料花了不少的时间。
为了与win7兼容,matlab应该安装2010a或2010b。
Matlab7导出的dll在win7下的vc2010中不兼容。
1:首先为matlab选择编译器在命名行窗口输入:mex -setup 按照提示选择vc2010 2:选择builder输入:mbuilder -setup 同样选择vc20103:将使用matlab写成的代码封装成函数,确认无错后开始生成dll。
在命令行输入:mcc -W cpplib:h_single -T link:lib h_single.m其中h_single是要导出的dll名称,h_single.m是matlab源文件。
不同版本的matlab生成dll的时间不一样,不知道我使用的matlab2012a为什么这么慢。
如果一切顺利,那么在.m文件目录下将会产生.lib,.dll,.h,.cpp,.ctf(matlab2010好像不再生成.ctf文件)等几个文件。
我们需要使用.lib,dll,.h文件。
dll生成后,剩下的就是在vc中调用了。
这跟使用其他dll是一软件英才网软件行业驰名招聘网站样的。
首先要包含dll头文件,除了要将本次生成的.lib文件填入:链接器-》输入内。
还需要加入mclmcr.lib 和mclmcrrt.lib。
最后将dll 文件放在可执行文件目录下。
matlab2010好像不再生成.ctf文件,因此不需要将ctf文件放在当前目录下,而在matlab7中却需要。
这些都只是准备工作,包含了头文件才能在vc内使用。
传入matlab函数的数据是有一定格式的。
因此需要将数据准备下,准备好之后传给matlab计算函数。
MATLAB6.5 与 VC6.0混合编程中的 VC6.0的设置

MATLAB6.5 与VC6.0混合编程中的VC6.0的设置1. VC6.0路径设置TOOLS(工具)—>Option(选择)—>Directories(目录):executatble files:C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin C:\Program Files\Microsoft Visual Studio\VC98\BINC:\Program Files\Microsoft Visual Studio\Common\TOOLSC:\Program Files\Microsoft Visual Studio\Common\TOOLS\WINNTinclude files:C:\Program Files\Microsoft Visual Studio\VC98\INCLUDEC:\Program Files\Microsoft Visual Studio\VC98\MFC\INCLUDE C:\Program Files\Microsoft Visual Studio\VC98\ATL\INCLUDED:\MATLAB6p5\extern\includeD:\MATLAB6p5\extern\include\cpplibrary files:C:\Program Files\Microsoft Visual Studio\VC98\LIBC:\Program Files\Microsoft Visual Studio\VC98\MFC\LIBD:\MATLAB6p5\extern\lib\win32D:\MATLAB6p5\extern\lib\win32\microsoft\msvc60source files:C:\Program Files\Microsoft Visual Studio\VC98\MFC\SRCC:\Program Files\Microsoft Visual Studio\VC98\MFC\INCLUDE C:\Program Files\Microsoft Visual Studio\VC98\ATL\INCLUDE C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC2. VC6.0工程设置Project->Setting->C/C++ :(1) 在Category 中选择Code Generation;(2) 在Use run-time library 中选择Debug-SingleThreaded,; (3) Precompiled Headers,选择Automatic use of precompiled headers, 并且在Through header 下面添加stdafx.h; (4) 在Category 中选择Preprocessor ,在preprocessor definitions 中添加MSVC,MSWIND,IBMPC。
VC和Matlab混合编程

VC和Matlab混合编程VC调用Matlab的方法有多种,为了对混合编程有一个大概认识,将常用的几种方法中介绍一下:一、通过Matlab Engine方式Matlab Engine是指一组Matlab提供的接口函数,支持C语言,Matlab Engine采用C/S(客户机/服务器)模式,Matlab作为后台服务器,而C程序作为前台客户机,通过Windows的动态控件与服务器通信,向Matlab Engine传递命令和数据信息,从Matlab Engine接受数据信息。
用户可以在前台应用程序中调用这些接口函数,实现对Matlab Engine的控制。
采用这种方法几乎能利用Matlab全部功能,但是需要在机器上安装Matlab软件,而且执行效率低,因此在实际应用中不采用这种方法,在软件开发中也不可行,我认为适合个人使用或做演示用,因此不打算介绍。
二、直接调用Matlab的C/C++数学函数库Matlab中提供了可以供C/C++语言调用的C/C++数学函数库,其中包含了大量用C\C++语言重新编写的Matlab数学函数,这些函数涉及到线形代数、数值分析、傅立叶变换、多项式计算、解微分方程等,并且函数库中提供了大量各种矩阵操作函数,在VC中可以直接使用这些函数,通过这些函数可以在VC中方便的实现在Matlab中矩阵运算功能。
可以看出用这种方法可以很灵活的调用Matlab来编写应用程序,但要求读者对C\C++语言比较熟悉,可以看出使用这种方法调用Matlab的工具箱函数有很大困难。
适合对C\C++语言比较熟悉的用户使用。
三、用Matlab自带的Matlab CompilerMatlab Compiler的作用是将m文件转化成C/C++代码(也就是通常所用的mcc命令),这种源代码需要用C/C++编译器编译连接成独立应用程序,在将m文件转成独立应用程序的过程中生成的C/C++文件,原则上是可以被其它的C/C++代码调用的,编译器可以通过设置mcc命令的选项,将m文件编译成动态链接库文件、C/C++文件、可执行文件等一系列文件。
MATLAB与VC混合编程.

MATLAB 与 VC 混合编程SCIE摘要:MATLAB 提供了很丰富的编程接口,可以通过这些接口使用其它语言来编写模块集成到 MATLAB 程序中,也可以在其它程序设计语言中调用 MATLAB 。
尽管如此,在某些情况下可能仍然不能满足某些特殊的要求, 本文从实际应用出发, 介绍了 MATLAB 与 VC 混合编程的一些方法。
需要特别说明的是:本文内容是针对MATLAB6.5和 VC6.0的,并不适应于其它版本的 MATLAB 。
关键词:混合编程 MATLAB VC 窗口嵌入一、 VC中使用编译得到的 C++源程序文件通过 MATLAB 的编译器我们可以将 m 代码编译为独立的可执行程序,从而达到脱离 MATLAB 、在未安装 MATLAB 的计算机上发布的目的。
但是这样做仍然不能满足如下要求: MATLAB设计的图形用户界面功能还不够强大,不支持表格、目录树以及分组单选按钮等控件;当在一个 GUI 中放置过多的控件时,速度会比较慢。
整个软件并不是以 MATLAB 为主开发的,需要把 MATLAB 编写的代码融合到软件主体中,而不是生成独立的程序。
需要修改 MALTAB 编译器自动生成的代码, 或在其中添加代码以实现特定的功能。
将 m 文件编译生成 C 或者 C ++代码,在 VC 中使用这些代码,就可以解决以上几个或者更多的问题。
在此之前,需要对 VC 的开发环境进行设置,添加MATLAB 的 Include 目录和 Library 目录,操作如下:启动 VC ,点击菜单 Tools-Options ,出现如下对话框:图表 1设置 Include 目录¾在 Show directories for下方的下拉框中选择 Include files,在 Directories 下方列表框的空白一行或者单击 Directories 右方的左起第一个按钮, 添加如下两个目录: $matlabroot\extern\include\cpp$matlabroot\extern\include¾在 Show directories for下方的下拉框中选择 Include files,在 Directories 下方列表框的空白一行或者单击 Directories 右方的左起第一个按钮, 添加如下两个目录: $matlabroot\extern\include\cpp$matlabroot\extern\include其中 $matlabroot为 MATLAB 的安装目录,如图表 2所示。
Matlab与VC++混编手册

一、目的通过混编方式,可以将Matlab强大的算法仿真运算能力真正运用到工程实际,使得自行开发系统的技术含量得到进一步提升。
混编后可以将基于Matlab开发的算法不编译成VC++程序,进而使得算法的整个运算过程在基于VC++开发的系统中独立运行,便于算法的实际调用。
二、混编所采用的软件推荐使用Microsoft V isual Studio 2005、Matlab R2007a或更高版本,以便使得源文件之间得到最佳的编译效果。
(如果使用VC++6.0请搭配Matlab6.5以便达到最好的兼容性,但具体编译环境配置请自行斟酌。
)三、编译过程1、启动Matlab R2007a,在command window键入:mex –setup(配置. Mexw32文件的编译环境,MatlabHelp中指出.mexw32文件在编译时可以当作.m文件进行引用,后面会有详细介绍)。
键入mex –setup回车后,Matlab显示如下:>> mex -setupPlease choose your compiler for building external interface (MEX) files:Would you like mex to locate installed compilers [y]/n? nSelect a compiler:[1] Borland C++ Compiler (free command line tools) 5.5[2] Borland C++Builder 6.0[3] Borland C++Builder 5.0[4] Compaq V isual Fortran 6.1[5] Compaq V isual Fortran 6.6[6] Intel C++ 9.1 (with Microsoft V isual C++ 2005 linker)[7] Intel Visual Fortran 9.1 (with Microsoft V isual C++ 2005 linker)[8] Intel Visual Fortran 9.0 (with Microsoft V isual C++ 2005 linker)[9] Intel Visual Fortran 9.0 (with Microsoft V isual C++ .NET 2003 linker)[10] Lcc-win32 C 2.4.1[11] Microsoft V isual C++ 6.0[12] Microsoft V isual C++ .NET 2003[13] Microsoft V isual C++ 2005[14] Microsoft V isual C++ 2005 Express Edition[15] Open WA TCOM C++ 1.3[0] NoneCompiler: 13Y our machine has a Microsoft V isual C++ 2005 compiler located atD:\Microsoft Visual Studio 8. Do you want to use this compiler [y]/n? yPlease verify your choices:Compiler: Microsoft V isual C++ 2005Location: D:\Microsoft V isual Studio 8Are these correct?([y]/n): y***************************************************************************Warning: MEX-files generated using Microsoft V isual C++ 2005 requirethat Microsoft V isual Studio 2005 run-time libraries beavailable on the computer they are run on.If you plan to redistribute your MEX-files to other MA TLABusers, be sure that they have the run-time libraries.Y ou can find more information about this at:/support/solutions/data/1-2223MW.html***************************************************************************Trying to update options file: C:\Documents and Settings\Administrator\Application Data\MathWorks\MA TLAB\R2007a\mexopts.batFrom template: D:\MA TLAB~1\bin\win32\mexopts\msvc80opts.batDone . . .其中红色字符为用户选项输入,输入时注意检查VC++编译器目录是否正确。
matlab与vc混合编程(绝对无误)

matlab与vc混合编程1、环境设置在桌面上右键单击“我的电脑”图标出现以下菜单单击“属性”菜单项,出现“系统特性”对话框,单击“高级”选项卡,如下图所示在上图中,单击“环境变量”按钮,出现“环境变量”对话框,添加系统变量 matlab 值为 D:\MATLAB 即 matlab 的安装路径,如下图所示在环境变量 path 中加入 D:\MATLAB\bin\win32 ,如下图所示按“确定”完成设置后,重启计算机或注销当前用户,即可应用新设置。
2、matlab 编译器设置(1) mex 命令设置(a) 运行 matlab ,在 matlab 的命令窗口 (Command Window) 键入“ mex -setup ”命令后,按回车键,安装 matlab 编译器;(b) 命令窗口出现如下提示mex -setupPlease choose your compiler for building external interface (MEX) files:Would you like mex to locate installed compilers [y]/n?此时键入”y”,按回车;(c) 命令窗口出现如下提示Select a compiler:[1] Digital Visual Fortran version 6.0 in C:\Program Files\Microsoft Visual Studio[2] Lcc C version 2.4.1 in D:\MATLAB\sys\lcc[3] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio[4] Open WATCOM C/C++ version 1.3 in D:\Maple11[0] None此时键入”3”,按回车;选择 Microsoft Visual C++6.0 的编译器(d) 命令窗口出现如下提示Please verify your choices:Compiler: Microsoft Visual C/C++ 6.0Location: C:\Program Files\Microsoft Visual StudioAre these correct?([y]/n):此时键入”y”,按回车;确认选择 Microsoft Visual C++6.0 的编译器(2) mbuild 命令设置(a) 运行 matlab ,在 matlab 的命令窗口 (Command Window) 键入“ mbuild -setup ”命令后,按回车键,安装 matlab 编译器;(b) 命令窗口出现如下提示mbuild -setupPlease choose your compiler for building standalone MA TLAB applications:Would you like mbuild to locate installed compilers [y]/n?此时键入”y”,按回车;(c) 命令窗口出现如下提示Select a compiler:[1] Lcc C version 2.4.1 in D:\MATLAB\sys\lcc[2] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Stu dio[0] None此时键入”2”,按回车;选择 Microsoft Visual C++6.0 的编译器(d) 命令窗口出现如下提示Please verify your choices:Compiler: Microsoft Visual C/C++ 6.0Location: C:\Program Files\Microsoft Visual StudioAre these correct?([y]/n):此时键入”y”,按回车,确认选择 Microsoft Visual C++6.0 的编译器,编译器设置完成。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)的统计值图形,它表征某个灰度值出现的概率。