基于MATCOM 平台的VC++与MATLAB混合编程地震正演模拟(完整版)
- 格式:doc
- 大小:3.30 MB
- 文档页数:9
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命令。
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混合编程的系统仿真
彭秋红;曹法会
【期刊名称】《机电产品开发与创新》
【年(卷),期】2009(0)3
【摘要】采用VC和Matlab,分析了使用Matlab的mcc命令实现混合编程的方法,并通过一个信号采集系统实例,说明VC和Matlab混合编程的配置,结合具体程序实现了信号采集系统的仿真.
【总页数】3页(P128-130)
【作者】彭秋红;曹法会
【作者单位】平顶山工业职业技术学院,河南,平顶山,467001;辉县市第四高级中学,河南,辉县,453638
【正文语种】中文
【中图分类】TP391.72
【相关文献】
1.MATLAB和VC混合编程在时滞混沌系统仿真中的应用 [J], 赖宏慧
2.VC与Matlab混合编程技术在现代控制理论系统仿真中的应用 [J], 蔡浩宇;王红波;杨树仁;刘锦廉;索辉
3.基于VC++与MATLAB混合编程的数字基带传输系统仿真的实现 [J], 严冬;吴森
4.基于MATLAB与VC混合编程的飞机刹车系统仿真 [J], 姜伟;谢利理;雒雪芳
5.MATLAB与VC++混合编程在系统仿真中的应用 [J], 陶桂宝;郭少波
因版权原因,仅展示原文概要,查看原文内容请购买。
基于Matlab与VC混合编程的研究
亓慧;张艳丽;陈振生
【期刊名称】《现代电子技术》
【年(卷),期】2004(027)019
【摘要】针对Matlab和Visual C++应用的特点,讨论了在VC中调用Matlab的3种方法,着重介绍了利用Matcom和Matlab编译器进行混合编程的方法和步骤,为开发处理大量数据的应用程序提供了依据.
【总页数】3页(P11-12,15)
【作者】亓慧;张艳丽;陈振生
【作者单位】山东大学,生物医学工程所,山东,济南,250061;山东大学,生物医学工程所,山东,济南,250061;山东大学,生物医学工程所,山东,济南,250061
【正文语种】中文
【中图分类】TP312
【相关文献】
1.基于Matlab Add-in的Matlab/VC混合编程的研究 [J], 李霞;李萌彦
2.基于VC与MATLAB混合编程的复杂数字信号EMD处理技术研究 [J], 申文静;顾泽植
3.基于VC与MATLAB混合编程的研究 [J], 翟军红;王红宣
4.基于COM的MATLAB与VC++混合编程研究 [J], 苏波
5.基于MATCOM的MATLAB与VC混合编程技术研究 [J], 吴高峰;李熙莹
因版权原因,仅展示原文概要,查看原文内容请购买。
VC++与Matlab混合编程的研究与实现关键词: VC++,matlab,混合编[文章信息]作者: 朱立松帅亮安居白时间: 2004-10-07出处: 计算机与信息技术责任编辑: 方舟[文章导读]在分析Visual C++和Matlab各自特点的基础上,提出混合编程的几种方法,分析对比各种方案的优缺点VC++与Matlab混合编程的研究与实现摘要在分析Visual C++和Matlab各自特点的基础上,提出混合编程的几种方法,分析对比各种方案的优缺点。
并结合实例介绍比较简便实用的Matcom混合编程方案,该方案不仅能转化成C/C++函数,而且可以支持图形函数功能。
可以为科学研究和工程技术提供更强的技术支持。
关键词 Visual C++; Matlab; Matcom; 混合编程Matlab是Mathworks公司推出的数学软件,它将数值分析、矩阵计算、信号处理和图形显示结合在一起,包含大量高度集成的函数可供调用,命令语句功能十分强大,为科学研究、工程设计及众多学科领域提供了一种简洁、高效的编程工具。
但是Matlab使用的是解释性语言,大大限制了它的执行速度;源代码的公开不利于算法和数据的保密;局限于Matlab运行环境而不能用于开发商用软件。
Visual C++是Windows平台下主要的应用程序开发环境之一,它能方便实现软件开发,开发的系统具有界面友好、执行速度快、易维护和升级等优点。
但是在工程计算方面,和Matlab相比编程显得复杂的多。
因此实现VC与Matlab混合编程,使两者结合起来,协同工作,必将提高软件开发效率,使所开发的软件具有更高的性能,更大的应用范围,也可以为科学研究和工程技术提供更强的技术支持。
VC与Matlab混合编程的实现方案在VC环境中调用Matlab程序主要有以下几种方法:(1)用Matlab引擎,采用客户机/服务器(Client/Server)的计算模式。
在VC中设计程序框架,作为前端客户机,通过调用Matlab引擎与后台Matlab服务器建立连接,实现命令和数据信息的传递。
VC++与MATLAB混合编程及其应用摘要本文详述了在VC++6.0编译环境下如何利用Matlab来实现应用系统的设计和分析,介绍了通过Matlab与VC应用程序连接的常用方法,分析了VC与Matlab的混合编程的步骤,最后通过一个具体实例的实现过程对上述方法进行了应用性介绍。
关键词VC++;Matlab;混合编程Matlab 是由Math Works 公司于1984 年推出的数值计算及图形处理软件,可以实现数值分析、优化、统计、偏微分方程数值解、自动控制、信号处理、图像处理等若干领域的计算和图形显示功能。
其中,控制系统工具箱的集成为设计和分析各种复杂的控制系统提供了有效的方法和途径。
但是,由于Matlab开发平台的局限性,在其上面开发的程序不能脱离Matlab运行环境,因而在处理一些实际应用问题时显得灵活性不足,而VC++则在一定程度上能够弥补这一漏洞,因此,现将二者结合共用,各献其长,可以为科研工作和工程开发提供了更为强大的技术支持。
1、Matlab与VC混合编程的实现方法Matlab作为控制系统设计的一种通用工具,它可以和VC方便的进行连接。
一般而言,Matlab与VC混合编程的实现方法主要有以下三种方法:(1)通过引擎(Engine),采用客户机服务器的计算模式,通过Window的ActiveX通道和Matlab进行连接。
具体应用时,往往在VC中设计程序框架,以编译的程序作为前端客户机;通过调用Matlab引擎在后台实现与服务器的连接,实现动态通信(2)应用Matlab数学函数库,Matlab中包含了内容丰富的函数库,而且还提供了与VC的数学函数接口,用户可以方便的在VC的IDE(集成开发环境)中调用。
(3)通过DLL实现VC与Matlab的混合编程。
DLL是一个可执行的二进制文件。
把很多通用的功能放在DLL中,可以供多个应用程序调用,这样可以很好的减少外部存储空间的占有量,并实现代码的共享[2]。
第2卷第4期2003年10月 江南大学学报(自然科学版)Journal of Southern Yangtze U niversity(N atural Science Edition) Vol.2 No.4Oct. 2003 文章编号:1671-7147(2003)04-0352-04 收稿日期:2002-12-23; 修订日期:2003-09-13.作者简介:盛歆漪(1975-),女,江苏丹阳人,控制理论与控制工程硕士研究生.Matlab 、Matcom 与VC ++混合编程在FF T 上的实现盛歆漪, 须文波, 边继东(江南大学通信与控制工程学院,江苏无锡214036)摘 要:阐述了Matlab 与VC ++混合编程的各种方法,并以FF T 算法为例介绍了Matcom 与VC ++混合编程的方法.并将此方法与传统方法进行比较,验证了这种混合编程方法的优越性.关键词:Matlab ;Matcom ;VC ++;快速傅立叶变换;混合编程中图分类号:TP 311.11文献标识码:AImplementing FFT by Omnibus Programming of Matlab ,Matcom and VC ++SHEN G Xin 2yi , XU Wen 2bo , B IAN Ji 2dong(School of Communication and Control Engineering ,S outhern Y angtze University ,Wuxi 214036,China )Abstract :In this paper ,various methods of omnibus programming using Matlab and VC ++are described.To exemplify FF T algorithm ,The paper presents in detail the omnibus programming of Matcom and VC ++and shows that this technique outperforms the previous ones in many aspects.K ey w ords :Matlab ;Matcom ;VC ++;FF T ;omnibus programming Matlab 是一种基于C 语言内核的工程计算语言,集数值分析、矩阵运算、信号处理和图形显示于一体,构成了一个使用方便、界面友好的用户环境.其优点是:可扩展性强,允许用户自行建立指定功能的M 文件、开发自己的工具箱或利用现有的数百种商用Toolbox ,易学易用.Matlab 不需要用户具有高深的数学知识和程序设计能力,故开发效率高,周期短.然而Matlab 也存在某些缺点.如:Matlab 是一种解释性语言,其特点是以矩阵为基本数据结构,导致其执行效率相对C 或C ++语言要低很多;因Matlab 程序不能脱离其环境运行,故不能直接用于商用软件的开发;即也不易开发出具有Win32风格界面的通用程序.+Matcom 是Mathtool 公司(现已被MathWorks 公司收购)的产品,利用它可以把3.m 文件转换成C ++代码.而且利用Matcom 技术还可调用Matlab 中的大量函数.在Matcom 中包含了名为Matrix <L IB >的矩阵数学库(对于Matcom4.5来说库文件名为mdv4500v.lib ),该C ++库提供了一个双精度矩阵数据类型—Mm <double >.此外它还提供了许多函数,这些函数涉及线性代数、多项式、信号处理、文件输入输出、图像处理、绘图等方面,而且在VC ++中调用Matrix <L IB>中的函数,或使用它声明矩阵类型的对象较为容易,因此可用此库文件配合VC++实现各种复杂的数值算法软件.Visual C++是Microsoft的C++集成开发环境,其集成了功能强大的编辑器、编译器、连接器和调试器[1].在该环境下,可开发基于MFC的Win32程序以及基于Windows API的Win32的程序.其优点是代码效率高、执行速度快、可以开发出风格多样的界面.其不足是开发数值计算程序时编码的工作量较大.1 Matlab与Visual C++混合编程方法 用Matlab与Visual C++结合进行数值算法程序的开发,就可充分利用两者的优点.其一利用VC进行整体开发,其二利用Matlab编写数值算法的代码,再把代码转换和优化后嵌入C++代码中,这样既可开发出具有Win32风格的程序,又可保证一定的执行速度.1.1 Matlab与Visual C++混合编程的方法混合编程有几种结合方法:①首先在Matlab 下编写.m文件,后通过Matlab自身的编译连接器把.m文件转换成C++代码,并嵌入到VC++程序中[2];②通过客户-服务器方式,在VC++中使用Matlab服务引擎,通过引擎调用Matlab中的函数[2];③在VC++中包含Matlab中的数学函数库,使用数学函数库中的特定函数[3];④利用Matcom实现Matlab与Visual C++混合编程.其中方法①、②都不能脱离Matlab环境,方法③则需要用lib/def命令导出libmx.lib,libeng.lib 以及libmccmx.lib等静态连接文件,且这3种方法都不能有效地提高程序的执行效率.方法④还可分为两种方法,其一为在matlab下编好程序,然后利用matcom翻译成C++代码,在C++编译器下把这些代码编译成.exe文件;其二为直接利用matcom提供的矩阵类和相关函数在C++编译器下直接编程.前者所有变量还是基于矩阵的,故执行效率不会有较大提高,这里采用了后一种方法编程.1.2 在VC++中使用Matrix<L IB>的编程步骤①设置VC++环境选项及正确的包含文件及库文件路径;②将mdv4500v.lib加入到VC++工程中;③在相应位置加入matlib.h文件(用# include“matlib.h”语句实现);④在适当位置使用initM()语句对Matrix<L IB>库进行初始化;⑤声明矩阵变量,访问矩阵单元,调用Matrix<L IB>库中的函数;⑥用exitM()语句明确对库的调用结束.2 用Matcom与VC++.net共同编制快速傅立叶变换程序 作者以编制快速傅立叶变换(FF T)程序为例,说明如何在VC++.net环境下使用MatrixLib.首先,启动VC++.net集成开发环境,点击菜单项的“工具/选项”,在打开的对话框中选中“项目/VC+ +目录”,在“显示以下内容的目录”栏中选择“包含文件”项,点击“新行”菜单,加入一个新的路径“D: \matcom45\lib”(在此假设Matcom的安装路径为D:\matcom45,以下同);然后选择“库文件”,同样点击“新行”菜单加入一个新路径“D:\matcom45 \lib”.随后是建立具体的VC++解决方案:1)点击新建项目,选择VC++项目,在右边选中MFC应用程序,命名为myFF T,并选择存储位置,在MFC应用向导中接受所有默认选项;2)在VC++.net集成开发环境中点击“项目/添加现有项目”,选择D:\matcom45\lib目录中的matlib.h和mdv4500v.lib文件,单击“打开”.这样就把这两个文件添加到自己的工程中了. mdv4500v.lib将被连接到最后的可执行文件中,而matlib.h包含了所要用到的宏定义、常量声明和函数声明.所以应该把这两个文件添加到项目中来.3)在myFF TDoc.h文件开始处加入#include ″matlib.h″语句,并在类CmyFF TDoc中声明公有类型函数void my-fft(Mm&,Mm&,Mm&).然后在myFF TDoc.cpp中定义此函数.定义如下:void CmyFF TDoc::my-fft(Mm&m,Mm&p,Mm&f) {//初始化Matrix<L IB>initM(MA TCOM-V ERSION);//构造离散的时间向量,Mm类可声明各种矩阵或向量Mm t=(colon(0.0,1.0/100.0,10.021.0/ 100.0));//构造离散的信号向量Mm singal=sin(2.03pi315.03t)+sin(2.0 3pi340.03t);//变换后的结果将保存在result中Mm result;//对singal进行fft变换,结果保存在result中result=fft(singal);353 第4期盛歆漪等:Matlab、Matcom与VC++混合编程在FF T上的实现//计算幅值和相位m=abs(result);p=unwrap(angle(result));f=(colon(0.0,1.0,length(result)21.0))3 99.0/length(result);}4)在myFF TView.cpp中加入#include″matlib.h″,#include″MyFigure.h″语句,并对CmyFF TView映射WM-LBU TTONDOWN消息,函数为OnLButtonDown().5)给解决方案插入一对话框资源,去掉对话框上的所有控件,保留默认的ID值,对应类命名为CMyfigure,在Myfigure.h文件中加入#include″matlib.h″语句,并在类CMyfigure中声明公用变量m,p,f和init,isPhase.其中m,p,f为Mm型变量, init,isPhase为bool型变量.在类CMyfigure的构造函数中为init赋初值true.然后为类CMyfigure重载OnPaint()函数,并为此函数添加如下代码:if(init){ //创建一个支持MFC坐标系,句柄保存在h中Mm h=winaxes(m-hWnd);//设置作图区域axesposition(10,10,150,180);if(isPhase){//画出相频特性图 plot((CL(f),p3180.0/pi));title((CL (TM(”相频特性图”)))); xlabel((CL(TM(”频率”))));ylabel((CL (TM(”相角”))));}else{//画出幅频特性图 plot((CL(f),m));title((CL(TM(”幅频特性图”)))); xlabel((CL(TM(”频率”))));ylabel((CL (TM(”幅值”))));}set(h,(CL(TM(”Color”)),TM(”white”)));set(h,(CL(TM(”Box”)),TM(”on”)));init=false;}//图形可以放大、缩小、移动drawnow();exitM();6)为void CmyFF TView::OnLButtonDown (U IN T nFlags,CPoint point)添加如下代码: Mm m,p,f;//执行fft变换,幅值和相位保存在m和p中pDoc2>my-fft(m,p,f);CMyfigure magnitudeDlg,phaseDlg;magnitudeDlg.m=m;magnitudeDlg.p=p;magnitudeDlg.f=f;//幅频特性曲线magnitudeDlg.isPhase=false;magnitudeDlg.DoModal();phaseDlg.m=m;phaseDlg.p=p;phaseDlg.f=f;//相频特性曲线phaseDlg.isPhase=true;phaseDlg.DoModal();最后,点击“生成/生成解决方案”,再点击“调试/开始执行(不调试)”就得到了一个Win32程序myFF T,然后点击鼠标左键就得到了图1和图2.图1 幅频特性图Fig.1 Magnitude2frequencyfeature图2 相频特性图Fig.2 Phase2frequency feature3 实现FF T所用编程方法的比较表1是在Pentium4(1.8G),内存384M的PC 机上,采用Matlab、VC++7.0以及Matcom与VC ++7.0混合编制的FF T程序的比较[3].453江南大学学报(自然科学版) 第2卷 表1 实现FFT 的3种编程方法的比较T ab.1 The comparison of 3methods of programming toimplementing FFT编程方法代码长度/行运行时间/sMatlab6.1语言9 1.9220Visual C ++7.0语言1080.0150Matcom4.5和VC ++7.0混合编程220.02004 结 论利用VC ++结合Matcom 编制数值算法的程序,执行速度比matlab 程序快,编码工作量比C ++程序少许多,但速度降低有限.编程实践表明,在编制复杂的数值算法程序时,采用此方法可明显缩短软件开发周期,且易于调试.参考文献:[1]DAV ID JKRU G L INSKI.Visal C ++技术内幕(第四版)[M ].潘爱民,王国印译.北京:清华大学出版社,1999.[2]李罗生,白立芬,李庆祥,等.用VC ++6.0和Matlab 语言混编开发图像处理实验软件[J ].实验技术与管理,2001,18(4):50-53.[3]徐士良.C 常用算法程序集[M ].北京:清华大学出版社,1996.(责任编辑:彭守敏)(上接第351页)图6 模糊逻辑控制方法仿真结果Fig.6 The simulation w aveform with fuzzy logic control图7 分层模糊控制方法仿真结果Fig.7 The simulation w aveform with hierarchical fuzzycontrol 1)模糊逻辑控制方法可以利用最优控制理论,减少模糊控制器的输入数目,以简化控制器的结构,但规则的设计和修改都相对复杂,而分层模糊控制方法就没有这些问题,规则设计符合人们的直觉判断,设计和修改简单明了.2)对于处理复杂系统,分层模糊控制不失为更高效的处理方法.因为应用了分层方式,只需较少的规则就可获得较好的结果.这一点可通过表1与表2、表3的比较得出.因此,对于多状态变量的复杂系统,分层模糊控制方式的应用,可极大地减少模糊规则设计的复杂性.而且,根据大规模系统理论,并行系统结构有利于减少计算时间.如果将非线性理论应用于分层模糊控制方法的优化,就可提高系统的稳定性,改善品质.所以对分层模糊控制进行分段线性化,将成为深化其应用的方向.参考文献:[1]RAJ U G V S ,ZHOU J ,KISN ER R A.Hierachical fuzzy control[J ].I nt J Control ,1991,54(5):1201-1216.[2]程福雁,钟国民,李友善.二级倒立摆的参变量模糊控制[J ].信息与控制,1995,24(3):189-192.[3]L I N IN G ,ZHAN G NAIY AO ,J IN K AIY AN.Structrue analysis of typical fuzzy controllers with unevenly distributed Inputmembership function[J ].Tsinghu a U niversity ,2000,40(1):120-123.[4]刘春生,吴庆宪,邹新生,等.量化因子对二级倒立摆模糊控制器性能的影响[J ].模式识别与人工智能,2000,13(4):404-406.(责任编辑:彭守敏)553 第4期盛歆漪等:Matlab 、Matcom 与VC ++混合编程在FF T 上的实现。
联合编程的操作步骤首先,我先说一下我所安装的环境,我的电脑是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。
基于MATCOM 平台的VC++与MATLAB混合编程地震正演模拟摘要:正演模拟是地震勘探的重要方法之一。
为解决基于Matcom4.5的VC++与Matlab接口程序的地震正演模拟问题,通过用Matcom4.5与VC++结合编程的新方法实现EDA介质中的地震波正演模拟的实例,结果显示通过Matcom实现VC++与Matlab混合编程的可行性并提高了编程效率。
关键词: Matcom;VC++; Matlab;混合编程;正演模拟MIXED PROGRAMMING OF SEISMIC FORW ARD MODELING BETWEEN VC++Abstract: Forward modeling is one of the important means in seismic exploration. This paper in order to solve the interface program of seismic forward modeling between Matlab and VC++ based on Matcom4.5,by using an example which achieved the results of simulate the wave equation in EDA media by a new method which is mixed programming between Matcom4.5 and VC++,the results show the advantage of efficiency by mixed programming between Matlab and VC++ based on Matcom4.5.Keywords: Matcom;VC++;Matlab;Mixed programming;Forward modeling0引言近年来,随着勘探程度深入化和勘探目标的复杂化,地震勘探无论在采集、处理还是解释技术方面都面临越来越多的挑战。
复杂构造油气田、岩性油气藏和裂缝性油气藏等隐蔽性油气藏的勘探与开发越来越受到地球物理工作者的重视。
为此,需要发展复杂介质的地震波传播理论,使其进一步接近地下介质的实际情况。
正演模拟研究对复杂介质中波的传播具有指导意义[1]。
目前在地震数据处理中应用比较广泛的软件是MATLAB,但由于MATLAB本身的程序编写的一些局限,使得它在处理许多应用问题时灵活性不够。
本文引入MATCOM软件平台,它的功能相当强大,可提供近千个MATLAB的基本功能函数,通过必要的设置,可以直接实现与C++的混合编程,而不必再依赖MATLAB;笔者基于MATCOM4.5的VC++与MATLAB的接口技术实现EDA介质中的地震波正演模拟,此方法提高了代码的使用效率,说明MATCOM与VC++混合编程的可行性,取得较好的效果,为技术人员提供了另一种实现正演模拟的途径,同时也为开展相应其他研究工作奠定了基础[2]。
1VC++与MATLAB接口Visual C++是Windows平台下主要的应用程序开发环境之一,它能方便地实现软件开发,开发的系统具有界面友好、执行速度快、易维护和升级等优点。
C++与其他高级语言相比具有很高的编译效率。
但在地震信号的图形、图像处理一类的应用中,当程序中涉及到对矩阵的运算时,编程就变得非常复杂。
MATLAB是Mathworks公司推出的数学软件,它将数值分析、矩阵计算、信号处理和图形显示结合在一起,包含大量高度集成的函数可供调用,命令语句功能十分强大,在地震数据的计算、图形和图像处理方面,MATLAB具有其他软件无法比拟的优势。
但是MATLAB使用的是解释性语言,大大限制了它的执行速度,并且源代码的公开不利于算法和数据的保密,局限于MATLAB运行环境而不能用于开发商业软件。
采用VC++和MATLAB混合编程,可以实现两者的优势互补,提高对地震数据处理的效率,具有更广泛的使用范围,为科学研究和工程技术提供更强的技术支持。
MATLAB开发环境提供了丰富的应用接口程序(API)函数库,包括MAT函数库、MEX函数库、MX函数库、Engine函数库,实现与其他工作环境的接口[3]。
1.1 通用VC++与MATLAB接口技术1.1.1 MATLAB编译器(compiler)使用MATLAB Compiler可以将M文件转化为C、C++和MEX文件。
首先使用mex -setup和mbuild -setup命令配置MATLAB Compiler的编译环境,使用mcc 命令将m文件转化为可独立于MATLAB开发环境的动态链接库文件(dll文件)和.exe文件。
在充分熟悉MATLAB开发环境的C/C++数学库前提下,可以实现在C++语言中直接调用MATLAB的C/C++数学库相关命令,从而优化mcc命令自动编译生成的C、C++程序代码。
但是这种方法不能处理嵌套调用脚本m文件,不支持MATLAB对象,不能编译MATLAB的一些内联函数,并且转换代码的可读性较差。
1.1.2 MATLAB引擎技术MATLAB应用程序接口(API)同时提供了一组引擎函数来启动和调用MATLAB 函数。
通过MATLAB引擎技术,可以保持C++编程语言的高效性并可以直接调用MATLAB丰富的工程应用函数,包括复杂的数学分析和信号处理函数等。
MATLAB Engine采用客户机/服务器模式,C/C++程序作为前台客户机,MATLAB作为计算引擎,利用Engine实现MATLAB的强大功能,引擎程序和C++程序各自作为一个进程单独运行,通过进程间的通信机制进行交互。
这种方法,需要在机器上安装MATLAB软件,而且程序执行效率低。
1.1.3 直接调用MATLAB C/C++ Math Library数学函数库MATLAB中提供了可以供C/C++语言调用的C/C++数学函数库,在VC++中可以直接使用这些函数[4]。
但使用这种方法调用MATLAB的工具箱函数有很大困难,适合对C/C++语言比较熟悉的用户使用,且不支持MATLAB中丰富的图形句柄处理函数。
1.2 MATCOM实现MATLAB与Visual C++接口当前MATCOM的最高版本是MATCOM4.5版本,可以支持与Visual C++的混合代码编译。
MATCOM提供了Visual MATCOM工具来实现在Visual C++环境下编译、运行MATLAB的m文件,MATCOM是一个非常有用的.m文件编译器,它有4大优点:①MATCOM是MATHTOOL公司推出的一种MATLAB编译平台,可以对MATLAB函数进行文本编译、直接运行,或者将MATLAB开发环境的m文件编译成.exe文件和.dll 文件,它与VC++有良好的接口,只要包含必要的库文件和头文件即可实现对MATLAB函数的调用,而无需运行MATLAB。
MATCOM转换过程简单,不仅可以转换独立的脚本文件,也可以转换嵌套脚本文件,它还支持一定的图形显示;②在Visual C++中启用Visual MATCOM Add-in插件,可以直接将MATLAB的m文件导入Visual C++环境中,并自动转化为对应的.h头文件和.cpp文件,与MATLAB 自带的编译器(Compiler)相比,MATCOM将m文件转化后的.cpp文件简单、易读,程序代码可读性好;③MATCOM提供了.m文件的方便快捷的编译调试环境,可以使用step、watch、breakpoint等各种调试手段;④MATCOM同时也提供了自带的Matrix <LIB> C++数学库,该数学库包含众多的数学函数,可以实现在Visual C++中使用这些数据函数进行数学分析、信号处理和图像处理等,使用Matrix<LIB>的C++数学库进行C++编程可以极大提高程序代码效率。
MATCOM的矩阵运算部分是基于一个名为Matrix<lib>的C++数学库,这个库提供了绝大多数的关于矩阵类、矩阵操作函数、数值计算函数、数学函数等的定义,在MATCOM中是以lib目录下的*.lib以及windows/system/对应名称的dll 文件提供的。
MATCOM的另一大部分就是图形部分,它是用一种非常流行的绘图OCX控件Teechart来实现的,这种控件对于一般的绘图功能都可以实现,但也存在一定缺陷。
绘图函数功能主要在lib文件和window/system/ago*.dll中定义[5]。
MATCOM编译.m文件时先将.m文件按照与MATCOM的cpp库的对应关系,翻译为cpp源代码,然后用对应版本的C编译器将该cpp文件编译为exe或dll文件,所以,在第一次运行时指定C Compiler的路径是必需的,否则将无法编译。
指定好的C Compiler信息写在Matcom/bin/matcom.ini文件中。
以MATCOM4.5、MATLAB2010b、VC++6.0和Windows7操作系统为例,Visual MATCOM的安装过程为:①安装MATCOM4.5;②拷贝<MATCOM45>\bin\usertype.dat文件到<Visual C++ 6.0>\ Common\ MSDev98\Bin目录下(<MATCOM45>、<Visual C++6.0>分别指MATCOM4.5和VC++6.0的安装路径);③运行Visual C++6.0,从菜单条中选择“工具/定制/附加项和宏文件”,选择“浏览”,改变文件类型为Add-ins(.dll),选定<MATCOM45>\ bin\mveide.dll文件,确信Visual MATCOM Add-in被选定,点击“关闭”;④此时,可以在Visual C++的开发环境中看到Visual MATCOM工具栏,表明安装成功;⑤点击VC环境中Visual MATCOM工具栏第一个或第二个按钮实现m文件向C/C++文件的转换[6-8]。
2基于MATCOM的EDA介质中的地震波正演模拟实例地震波正演模拟是研究复杂地层的重要手段。
数值模拟的方法主要有两类:波动方程法和几何射线法。
波动方程数值模拟实质是求解波动方程,它模拟的地震波场包含了地震波传播的所有信息,为研究地震波的传播机理和复杂地层的解释提供了更多的佐证,所以波动方程数值模拟方法在地震模拟中占有更重要的地位[9]。
2.1 实例首先要建立一个EDA介质模型,进行正演模拟的EDA介质模型大小为t∆=,⨯个网格点,纵波速度为2540m/s,横波速度为1430m/s,1ms 400400∆=∆=∆=。