下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 VC与matlab混编画图

VC与matlab混编画图.doc

VC与matlab混编画图

biogramile
2013-04-16 0人阅读 举报 0 0 暂无简介

简介:本文档为《VC与matlab混编画图doc》,可适用于IT/计算机领域

我的m文件是这样的:  functionlizi()  x=importdata('D:matlabworkabctxt')  y=importdata('D:matlabworkytxt')  arfs=  psdHRV,fHRV=pmcov(y,,arfs,)  lenpsd=length(psdHRV)  fhrv=fHRV(:lenpsd)  psdHRV=psdHRV(:lenpsd)  plot(fhrv,psdHRV) 就是打开两个数据文件计算功率谱密度并显示图形。在matlab软件下编译成功。在comtool环境下建立工程并编译得到了com组件。然后建了一个基于对话框的mfc程序sunsun并建立一个按钮调用matlab程序并显示图形。通过VC中Tools〉OLEviewer里的MATLABCOMBuilderConponents保存得到了sunnyh,sunnyc(sunny为com组件工程名)并连同sunnydllmwcomutilh复制到了mfc工程目录下。并将testcomh,testcomcmwcomutilh添加到程序中并添加相应的import的include的头文件在按钮的响应程序中我是这么写的: CoInitialize()初始化COM Isunshijie*pIsunlijun HRESULThr=CoCreateInstance(CLSIDsunshijie,,CLSCTXALL,IIDIsunshijie,(void**)pIsunlijun) if(FAILED(hr))测试创建是否成功 { AfxMessageBox("createfailed") return } hr=pIsunlijun>lizi() 我点了按钮之后程序一直在运行最后也不报错但是在编译框显示Firstchanceexceptioninsunsunexe(KERNELDLL):xED:MicrosoftCException 就是不调出图形我是完全按照一个例子写的而且用例子中提到的如下的m文件:  functionhuatu()  x=::  y=sin(x)  plot(x,y) 按照以上的步骤建立com组件并通过vc调用获得图形完全成功。 搞了快一个星期了google了也没找到原因请教各位我到底是哪里出了问题还请大家多多指教谢谢大家。  我以后复杂的matlab程序是在数据库中保存数据文件然后通过在vc中从数据库选择一个文件后对其进行信号处理。复杂程序中肯定不会直接这样直接存贮数据文件的。我在这里写这样一个简单的程序就是想先把简单程序混编并画图的流程搞清楚然后在应用到复杂的程序中因为我要脱离matlab环境所以并没有采用matlab做界面现在这个简单的程序混编都搞不出来所以上网问问各位高手 精通VC与MATLAB联合编程<九>综合举例一作者:邓科工具:VCMATLAB实现功能:用户输入数据,完成数据的拟合准备:在VC中设置库文件和头文件路径参见联合编程<><>步骤:、建立一个名为ceshidllm的M函数文件该函数的功能是输入两组数完成两组数据的插值拟合,并将结果用图形表示:ceshidllm文件内容如下:functionceshidll(x,y)a=min(x)::max(x)b=interp(x,y,a,''spline'')一维插值函数plot(x,y,''*'',a,b)、在MATLABCommand中用如下命令编译函数ceshidllm:>>mcctWlibhg:dlltestTlink:libhlibmmfilemlibceshidllm参数说明:t将m文件编译为CC代码Wlibhg:dlltest生成使用C函数图形库的文件生成的文件名为dlltestTlink:lib生成库文件h辅助选项可以将任何被调用的辅助函数都包含到编译的文件中libmmfilemlib连接任何需要的共享函数库ceshidllm被编译的文件名  编译完成后在MATLAB当前目录下会生成以下文件:ceshidllc、ceshidllh、dlltestc、dlltestexports、dlltesth、dlltestmlib、dlltestexp、dlltestlib、dlltestdll。其中dlltesth、dlltestlib和dlltestdll文件是我们需要的。、建立一个名为Fit基于对话框的MFC(exe)工程。在面板上添加一个名为“拟合”的Button按钮,界面如图。#include"matlabh"#include"dlltesth"#pragmacomment(lib,"dlltest")、为程序添加代码。在JFCcpp中为主程序添加代码。关键代码:UpdateData(TRUE)刷新输入数据doubleX,YCStringAA,BB,ainti=mxArray*A=初始化矩阵mxArray*B=AA=medit字符串赋值BB=medit将字符转化为数字mlfEnterNewContext(,)自动管理内存dlltestInitialize()mlfCeshidll(A,B)调用dll文件中函数mxDestroyArray(A)释放矩阵内存mxDestroyArray(B)mlfRestorePreviousContext(,)编译、连接运行结果如图: 图  本例子中实际上还是使用的函数库调用的函数库文件。不管是使用哪种接口方法函数库文件都是最底层的东西直接和CC打交道即使对版本也一样所以建议想学好接口编程的朋友最好能熟练的掌握函数库。我的QQ:。欢迎编程爱好者大家一起讨论。如果有时间下节介绍VC调用MATLAB神经网络工具箱的例子,并实现打包安装。转载VC中调用matlab函数VC与Matlab混合编程:VisualC是当前主流的应用程序开发环境之一开发环境强大开发的程序执行速度快。但在科学计算方面函数库显得不够丰富、读取、显示数据图形不方便。Matlab是一款将数值分析、矩阵计算、信号处理和图形显示结合在一起包含大量高度集成的函数可供调用适合科学研究、工程设计等众多学科领域使用的一种简洁、高效的编程工具。不过由于Matlab使用的是解释性语言大大限制了它的执行速度和应用场合。基于VC和Matlab混合编程是很多熟悉VC编程而又需要进行科学计算、数据仿真的科研人员常用的一种方式其中最简单也最直接的方法就是调用Matlab引擎。本文以下部分将详细介绍通过VC调用Matlab引擎来达到VC与Matlab数据共享编程的方法。  什么是Matlab引擎  所谓Matlab引擎(engine)是指一组Matlab提供的接口函数支持CC、Fortran等语言通过这些接口函数用户可以在其它编程环境中实现对Matlab的控制。可以主要功能有:  ★打开关闭一个Matlab对话  ★向Matlab环境发送命令字符串  ★从Matlab环境中读取数据  ★向Matlab环境中写入数据。  与其它各种接口相比引擎所提供的Matlab功能支持是最全面的。通过引擎方式应用程序会打开一个新的Matlab进程可以控制它完成任何计算和绘图操作。对所有的数据结构提供的支持。同时引擎方式打开的Matlab进程会在任务栏显示自己的图标打开该窗口可以观察主程序通过engine方式控制Matlab运行的流程并可在其中输入任何Matlab命令。  实际上通过引擎方式建立的对话是将Matlab以ActiveX控件方式启动的。在Matlab初次安装时会自动执行一次:matlabregserver  将自己在系统的控件库中注册。如果因为特殊原因无法打开Matlab引擎可以在Dos命令提示符后执行上述命令重新注册。  配置编译器  要在VC中成功编译Matlab引擎程序必须包含引擎头文件engineh并引入Matlab对应的库文件libmxlib、libmatlib、libenglib。具体的说打开一个工程后做如下设置(以VC为例):  )通过菜单工程选项打开设置属性页进入Directories页面在目录下拉列表框中选择Includefiles添加路径:"C:matlabexterninclude"(假定matlab安装在C:matlab目录)。  )选择Libraryfiles添加路径:C:matlabexternlibwinmicrosoftmsvc。  )通过菜单工程设置打开工程设置属性页进入Link页面在Objectlibrarymodules编辑框中添加文件名libmxliblibmatliblibenglib。  以上步骤)、)只需设置一次而步骤)对每个工程都要单独设定对于其它C编译器如BorlandCBuilder设置大体相同不再赘述。  引擎API详解  在调用Matlab引擎之前首先应在相关文件中加入一行:#include"engingh"该文件包含了引擎API函数的说明和所需数据结构的定义。可以在VC中调用的引擎函数分别如下:  引擎的打开和关闭  engOpen-打开Matlabengine  函数声明:Engine*engOpen(constchar*startcmd)  参数startcmd是用来启动Matlab引擎的字符串参数在Windows操作系统中只能为。  函数返回值是一个Engine类型的指针它是在engineh中定义的engine数据结构。  EngClose-关闭Matlab引擎  函数声明:intengClose(Engine*ep)  参数ep代表要被关闭的引擎指针。  函数返回值为表示关闭成功返回表示发生错误。  例如通常用来打开关闭Matlab引擎的代码如下:Engine*ep定义Matlab引擎指针。if(!(ep=engOpen()))测试是否启动Matlab引擎成功。{MessageBox("Can'tstartMatlabengine!")exit()}…………engClose(ep)关闭Matlab引擎。  向Matlab发送命令字符串  engEvalString-发送命令让Matlab执行。  函数声明:intengEvalString(Engine*ep,Constchar*string)  参数ep为函数engOpen返回的引擎指针字符串string为要matlab执行的命令。  函数返回值为表示成功执行返回说明执行失败(如命令不能被Matlab正确解释或Matlab引擎已经关闭了)。  获取Matlab命令窗口的输出  要在VC中获得函数engEvalString发送的命令字符串被Matlab执行后在matlab窗口中的输出可以调用engOUtputBuffer函数。  函数声明:intengOutputBuffer(Engine*ep,char*p,intn)  参数ep为Matlab引擎指针p为用来保存输出结构的缓冲区n为最大保存的字符个数通常就是缓冲区p的大小。该函数执行后接下来的engEvalString函数所引起的命令行输出结果会在缓冲区p中保存。如果要停止保存只需调用代码:engOutputBuffer(ep,,)。  读写Matlab数据  从Matlab引擎工作空间中获取变量。mxArray*engGetVariable(Engine*ep,constchar*name)  参数ep为打开的Matlab引擎指针name为以字符串形式指定的数组名。  函数返回值是指向name数组的指针类型为mxArray*(mxArray数据类型在本文第节详细简介)。  向Matlab引擎工作空间写入变量。intengPutVariable(Engine*ep,constchar*name,constmxArray*mp)  参数ep为打开的Matlab引擎指针mp为指向被写入变量的指针name为变量写入后在Matlab引擎工作空间中的变量名。函数返回值为表示写入变量成功返回值为表示发生错误。  调用引擎时显示隐藏Matlab主窗口  默认情况下以engine方式调用Matlab的时候会打开Matlab主窗口可在其中随意操作。但有时也会干扰应用程序的运行可用以下设置是否显示该窗口。intengSetVisible(Engine*ep,boolvalue)  参数ep为打开的Matlab引擎指针value为是否显示的标志取值true(或)表示显示Matlab窗口取值false(或)表示隐藏Matlab窗口。  函数返回值为表示设置成功为表示有错误发生。  要获得当前Matlab窗口的显示隐藏情况可以调用函数:intengGetVisible(Engine*ep,bool*value)  参数ep为打开的Matlab引擎指针Value为用来保存显示隐藏情况的变量(采用指针方式传递)。  函数返回值为表示获取成功为表示有错误发生。数据类型mxArray的操作  在上节的Matlab引擎函数中所有与变量有关的数据类型都是mxArray类型。数据结构mxArray以及大量的mx开头的函数广泛用于Matlab引擎程序和MatlabC数学库中。mxArray是一种很复杂的数据结构与Matlab中的array相对应我们只需熟悉Matlab的array类型和几个常用的mxArray函数即可。  在VC中所有和Matlab的数据交互都是通过mxArray来实现的在使用mxArray类型的程序中应包含头文件matrixh不过在引擎程序中一般会包含头文件engineh该文件里面已经包含了matrixh因此无需重复包含。  创建和清除mxArray型数据  Matlab有很多种变量类型对应于每种类型基本上都有一个函数用于创建但它们都有相同的数据结构就是mxArray。  数组的建立采用mxCreatexxx形式的函数例如新建一个double类型数组可用函数mxCreateDoubleMatrix函数形式如下:mxArray*mxCreateDoubleMatrix(intm,intn,mxComplexityComplexFlag)  参数m和n为矩阵的函数和列数。ComplexFlag为常数用来区分矩阵中元素是实数还是复数取值分别为mxREAL和mxCOMPLEX。  例如创建一个行列的二维实数数组可用如下语句:mxArray*T=mxCreateDoubleMatrix(,,mxREAL)  对应的要删除一个数组mxDestroyArray该函数声明如下:voidmxDestroyArray(mxArray*arrayptr)  参数arrayptr为要删除的数组指针。  例如要删除上面创建的数组T可用如下语句:mxDestroyArray(T)  类似的创建函数还有:mxArray*mxCreateString(constchar*str)  创建一个字符串类型并初始化为str字符串。  一般的在VC与Matlab交互中以上两种类型就够了其它类型数组的创建这里不再介绍。  管理mxArray数据类型  管理mxArray数据大小  要获得mxArray数组每一维上元素的个数可以用mxGetM和mxGetN函数。其中mxGetM用来获得数组第一维的元素个数对于矩阵来说就是行数。intmxGetM(constmxArray*arrayptr)返回arrayptr对应数组第一维的元素个数(行数)intmxGetN(constmxArray*arrayptr)返回arrayptr对应数组其它维的元素个数对于矩阵来说是列数。对于多维数组来说是从第维到最后一维的各维元素个数的乘积。  要获得某一特定维的元素个数则要用函数:constint*mxGetDimensions(constmxArray*arrayptr)  该函数返回arrayptr各维的元素个数保存在一个int数组中返回。对于常用的矩阵来说用mxGetM和mxGetN两个函数就可以了。  另外还可以通过mxGetNumberOfDimensions来获得数组的总的维数用mxSetM、mxSetN设置矩阵的行数和列数函数说明如下:mxGetNumberOfDimensions(constmxArray*arrayptr)返回数组的维数voidmxSetM(mxArray*arrayptr,intm)设置数组为m行voidmxSetN(mxArray*arrayptr,intn)设置数组为n列  判断mxArray数组类型  在对mxArray类型的变量进行操作之前可以验证以下其中的数组的数据类型比如是否为double数组、整数、字符串、逻辑值等以及是否为某种结构、类、或者是特殊类型比如是否为空数组是否为inf、NaN等。常见的判断函数有:boolmxIsDouble(constmxArray*arrayptr)boolmxIsComplex(constmxArray*arrayptr)boolmxIsChar(constmxArray*arrayptr)boolmxIsEmpty(constmxArray*arrayptr)boolmxIsInf(doublevalue)…………  这些函数比较简单意义自明不再解释。  管理mxArray数组的数据  对于常用的double类型的数组可以用mxGetPr和mxGetPi两个函数分别获得其实部和虚部的数据指针这两个函数的声明如下:double*mxGetPr(constmxArray*arrayptr)返回数组arrayptr的实部指针double*mxGetPi(constmxArray*arrayptr)返回数组arrayptr的虚部指针  这样就可以通过获得的指针对mxArray类型的数组中的数据进行读写操作。例如可以用函数engGetVariable从Matlab工作空间读入mxArray类型的数组然后用mxGetPr和mxGetPi获得数据指针对并其中的数据进行处理最后调用engPutVariable函数将修改后的数组重新写入到Matlab工作空间。具体实现见第节程序实例。程序实例  对大部分软件研发人员来说利用VC编程方便、高效但是要显示数据图形就不那么容易了这时候不防借助Matlab引擎辅助画图做数据分析。下面通过实例演示如何利用VC调用Matlab绘图程序的主要功能是在VC中对数组x计算函数值y=sin(x)±log(x)然后调用Matlab绘制y对x的图形。  在VC中新建工程编写代码如下:#include<iostream>#include<mathh>#include"engineh"usingnamespacestdvoidmain(){ constintN= doublexN,yN intj= for(inti=i<Ni)计算数组x和y {  xi=(i)  yi=sin(xi)j*log(xi)产生-之间的随机数赋给xxi  j*= } Engine*ep定义Matlab引擎指针。 if(!(ep=engOpen()))测试是否启动Matlab引擎成功。 {  cout<<"Can'tstartMatlabengine!"<<endl  exit() } 定义mxArray为行N列的实数数组。 mxArray*xx=mxCreateDoubleMatrix(,N,mxREAL) mxArray*yy=mxCreateDoubleMatrix(,N,mxREAL)同上。 memcpy(mxGetPr(xx),x,N*sizeof(double))将数组x复制到mxarray数组xx中。 memcpy(mxGetPr(yy),y,N*sizeof(double))将数组x复制到mxarray数组yy中。 engPutVariable(ep,"xx",xx)将mxArray数组xx写入到Matlab工作空间命名为xx。 engPutVariable(ep,"yy",yy)将mxArray数组yy写入到Matlab工作空间命名为yy。 向Matlab引擎发送画图命令。plot为Matlab的画图函数参见Matlab相关文档。 engEvalString(ep,"plot(xx,yy)") mxDestroyArray(xx)销毁mxArray数组xx和yy。 mxDestroyArray(yy) cout<<"Pressanykeytoexit!"<<endl cinget() engClose(ep)关闭Matlab引擎。}小结  本文详细的介绍了Matlab引擎使用方法并演示了一个简单的利用VC调用Matlab画图的程序实例。大多数时候程序员可以利用Matlab强大的数据读写、显示能力和VC编程的高效率。例如在Matlab中要读入一幅任意格式的图像均只需一条命令i=imread('testjp')图像数据矩阵便存放在了二维数组i中可以通过VC读入该数组进行相关处理再调用Matlab显示这种混合编程方式能大大提高工作效率。  当然利用VC编译的Matlab引擎程序运行环境中还必须Matlab的支持如果要编译完全脱离Matlab的程序可采用其它方式如利用第三方Matcom程序编译独立的可执行程序等From:http:hibaiducomkenterblogitemdbefefbfhtml发信人:helotus(blue),信区:MathTools标 题:转载Re:VC中如何调用Matlab来画图?发信站:同舟共济站(年月日::星期三),站内信件 经过几天的查阅资料并在好友cn的帮助下总算将问题解决了。 我将部分原码贴出来以解曾与我有相同经历的网友之惑。 注:matlab程序本身可做以dde方式通信的服务器(详见matlab的pdf帮助文档) 我的程序是画一*矩阵的波形图最后得到的图形以CFMETAFILEPICT格式 存放在剪贴板内因篇幅所限如何从剪贴板取该图形并显示的程序我省掉了 程序没来得及整理了将就着看。 #include"ddemlh" DWORDgdwClientId= HSZ ghszServiceName HSZ ghszTopic HCONVghConv intdata voidCMatserView::OnDde() {     HSZhszItem     UINTuresult     boolbresult    chardatad="ttttttttt"     char*datad        charszbuff="bar(::*pi,sin(::*pi))"        charszbuff="a=*"      charszbuff="T=*T"   charszbuff="plot(T)"     char*infowro     intnum     PBYTEpdata     PBYTEpbuffer     LPBYTEpb   HDDEDATAhdata,hdata     将矩阵转化为matlab认可的格式     CStringsTemp=""     charsFloat     for(inti=i<i)     {         sprintf(sFloat,"ft",(double)datai)         sTemp=sFloat     }     sprintf(sFloat,"f",(double)data)     sTemp=sFloat     datad=sTempGetBuffer(sTempGetLength())     charbuffer 连接服务器matlab     uresult=DdeInitialize(gdwClientId,CLIENTDdeCallback,         APPCMDCLIENTONLY,)     ghszServiceName=DdeCreateStringHandle(gdwClientId,"Matlab",CPWINANS I)   ghszTopic=DdeCreateStringHandle(gdwClientId,"Engine",CPWINANSI)     ghConv=DdeConnect(gdwClientId,ghszServiceName,         ghszTopic,)     if(ghConv==)     {         MessageBox("cannotconnecttosever")         return     }     else         MessageBox("connecttosever")     传送数据给matlab   num=sizeof(datad)     TRACE("nnum=dn",num)     hszItem=DdeCreateStringHandle(gdwClientId,"T",CPWINANSI)   hdata=DdeCreateDataHandle(gdwClientId,(LPBYTE)datad,strlen(datad),         ,hszItem,CFTEXT,HDATAAPPOWNED)     pb=(LPBYTE)GlobalLock(hdata)     bresult=(bool)DdeClientTransaction((LPBYTE)hdata,,sizeof(data) ,         ghConv,hszItem,CFTEXT,XTYPPOKE,,)     if(!bresult)     {     switch(DdeGetLastError(gdwClientId))         {         caseDMLERRNOTPROCESSED:             infowro=""             break         caseDMLERRBUSY:             infowro=""             break         caseDMLERRPOKEACKTIMEOUT:             infowro=""             break         caseDMLERRSERVERDIED:             infowro=""             break         default:             infowro=""             break         }         MessageBox(infowro)     }     else         MessageBox("matrixisok")     DdeFreeDataHandle(hdata)     命令matlab画图     hszItem=DdeCreateStringHandle(gdwClientId,"EngEvalString",CPWINANSI )     hdata=DdeCreateDataHandle(gdwClientId,(LPBYTE)szbuff,sizeof(szbuff) ,         ,L,CFTEXT,HDATAAPPOWNED)     bresult=(bool)DdeClientTransaction((LPBYTE)hdata,,sizeof(szbuff ),         ghConv,L,,XTYPEXECUTE,,)     if(!bresult)     {     switch(DdeGetLastError(gdwClientId))         {         caseDMLERRNOTPROCESSED:             infowro=""             break         caseDMLERRBUSY:             infowro=""             break         caseDMLERRPOKEACKTIMEOUT:             infowro=""             break         caseDMLERRSERVERDIED:             infowro=""             break         default:             infowro=""             break         }         MessageBox(infowro)         return     }     else         MessageBox("ok")     DdeFreeDataHandle(hdata)     请求图形结果若成功该图形在剪贴板内     hszItem=DdeCreateStringHandle(gdwClientId,"EngFigureResult",CPWINAN SI)     hdata=DdeClientTransaction(,,         ghConv,hszItem,CFTEXT,XTYPREQUEST,,)     if(hdata==)     {         switch(DdeGetLastError(gdwClientId))         {         caseDMLERRNOTPROCESSED:             infowro=""             break         caseDMLERRBUSY:             infowro=""             break         caseDMLERRPOKEACKTIMEOUT:             infowro=""             break         caseDMLERRSERVERDIED:             infowro=""             break         default:             infowro=""             break         }         MessageBox(infowro)         return     }     MessageBox("pictisok")     mbShowImage=true     mbtnViewShowWindow(true)     Invalidate(TRUE) } 相应的回调函数 HDDEDATACALLBACKCLIENTDdeCallback(                 UINTwType,UINTwFmt,                 HCONVhConv,HSZhszTopic,                 HSZhszItem,HDDEDATAhData,                 DWORDlData,DWORDlData) {     return } 【在longh(longzhou)的大作中提到:】 :我想将数据从VC的程序传给MALAB用后者画图 :再将后者所画的图传回给VC程序。但不知该如何下手:哪位高手愿给点提示告知如何做吗?谢谢!

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/17

VC与matlab混编画图

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利