欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    Matlab与Fortran的混合编程及其应用.pdf

    • 资源ID:70011524       资源大小:521.88KB        全文页数:5页
    • 资源格式: PDF        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Matlab与Fortran的混合编程及其应用.pdf

    第25卷 第1期 桂 林工学院学报Vol.25 No.12 0 0 5年1月 JOURNAL OF GU I L I N UN I VERSITYOF TECHNOLOGYJan12005文章编号:1006-544X(2005)01-0076-05Matlab与Fortran的混合编程及其应用刘羽1,2(11中国地质大学 地球物理与空间信息学院,武汉 430074;21桂林工学院 电子与计算机系,广西 桂林 541004)摘 要:介绍和分析了Matlab与Fortran混合编程的两种方式,即利用Mex文件和利用Matlab引擎;给出了其具体实现方法,并讨论了各自的优缺点和适用情况;给出了一个物探数据可视化的应用实例.分析和实验结果表明:通过Matlab与Fortran混合编程,不仅可以利用Mat2lab强大的图形功能和丰富的工程计算函数,还能发挥Fortran数值运算高效的特点和利用其原有的大量程序资源,从而使编程更为灵活、高效.如Fortran程序中有大量交互输入,宜采用Matlab引擎混合编程方式;如Fortran中要调用的Matlab函数较多,则应考虑采用Mex文件混合编程.关键词:Matlab;Fortran;混合编程;接口中图分类号:TP311 文献标识码:AMatlab提供了强大的矩阵运算和图形处理功能以及大量工程计算领域中常用的数值处理函数和高效工具箱,不仅编程效率很高,适合数据处理及结果的可视化,而且在理论和算法上成熟可靠.但由于是一种解释型语言,Matlab也有不足之处,如执行次数较多的循环特别是多层嵌套循环时速度较慢,不太适合做大规模的数值计算和分析1.Fortran语言是传统的数值处理语言,处理速度高,编程简便,有很多源代码资源可供使用,但绘图功能不强,在可视化方面需要编制复杂的代码.因此,用两种语言混合编程,可以充分利用Matlab中丰富的函数及Fortran语言原有的算法程序,弥补彼此的不足,这已成为当前科学问题和工程问题的一种良好解决方案.1Matlab与Fortran混合编程及数据传递方式111 混合编程方式Matlab提供了多种途径及相应的API(应用程序接口)函数实现与其它语言的混合编程,但就Fortran来说,常用的是利用Mex文件和利用Mat2lab引擎两种方式:前者是以Matlab为主调程序,调用Fortran代码编译后的Mex文件,此种方式必须在Matlab环境下运行;后者则是用Fortran设计应用程序框架,以其编译的程序作为前端客户机,通过调用Matlab引擎,实现后台与Matlab服务器的连接和动态通信.此种方式下,程序可在W in2dows下任何地方运行,但仍需要Matlab在后台运行.因此无论采用哪种方式,运行时都必须具有Matlab的支持.112数据传递方式多种语言的混合编程中,最重要的是要解决它们之间的数据传递问题.Matlab和Fortran语言的运算单位不同,前者是基于矩阵(mxArray结构体),后者是基于数,两者的数据类型无法直接匹配,必须通过Matlab提供的指针变量来进行交互.其基本原理:Matlab首先将需要传递的mxArray结构体的内存地址作为一个整型数值传给Fortran程序,然后在Fortran程序中调用Matlab引擎提供的访问函数,这些函数自动地将传给它的这个整数值作为地收稿日期:2004-11-01基金项目:广西自然科学基金资助项目(桂科基0339070)作者简介:刘羽(1961-),男,博士研究生,高级工程师,研究方向:数据处理、并行计算.址去读取或写入mxArray结构体中的相应数据.传统的Fortran 77不支持指针变量,因此必须借助Matlab的API函数来完成传递.若采用的编译器支持%vol结构(如Fortran 90),则可省去对API函数的调用而直接使用指针数据,效率更高.为更具普遍性,本文以Fortran 77为标准进行讨论.2混合编程211 利用Mex文件实现混合编程Mex是Matlab的可执行程序,在W indows环境中,它是扩展名为DLL的动态链接库,可以在Mat2lab中直接调用2.Fortran Mex文件通常由两个显著不同的部分组成:(1)计算子程序,是完成计算功能的纯Fortran程序,通常为现有的Fortran程序代码;(2)入口子程序,是计算子程序与Matlab环境之间的接口,用来完成相互之间的调用.计算子程序实际上被入口子程序当作子程序来调用,如果非常简单,也可以直接嵌入到入口子程序中,但为了保持可读性,一般不建议这么做.入口子程序名字为mexFunction,包含4个虚拟参数:Prhs,输入参数指针;Nrhs,输入参数个数;Plhs,输出参数指针;Nlhs,输出参数个数.调用格式为:subroutine mexFunction(nlhs,plhs,nrhs,prhs)入口子程序要跟Matlab进行数据交换,Matlab为此提供了1组编写Mex文件的API函数,表1列出了FortranMex文件的主要API函数.表1Mex文件常用的AP I函数及功能Table 1UsualAPI functions inMex file函数名称功 能 说 明 mex Function完成Mex文件和Matlab的接口功能mexGetArray从Matlab中读出矩阵mexPutArray向Matlab中写入矩阵mexGetArrayPtr获取Matlab工作空间中的矩阵指针mexCall Matlab调用Matlab指令、M函数和其它Mex文件mexErr MsgTxt处理异常情况mexEvalstring执行字符串所代表的Matlab命令以下通过一个简单例子来说明Fortran Mex文件的整体结构.该程序用于计算一个数的倍数(省略输入参数检查部分):c 定义入口子程序subroutine mexFunction(nlhs,plhs,nrhs,prhs)c 定义输入、输出指针,API函数integer plhs(3),prhs(3)integermxGetPr,mxCreateFullinteger x_pr,y_printeger nlhs,nrhsintegermxGet M,mxGet N,mxIsNumericintegerm,n,sizereal38 x,ym=mxGet M(prhs(1)n=mxGet N(prhs(1)c 计算输入数据的大小size=m3nc产生输出矩阵plhs(1)=mxCreateFull(m,n,0)c获取输入参数指针x_pr=mxGetPr(prhs(1)c获取输出参数指针y_pr=mxGetPr(plhs(1)c将输入数据传送到x以便计算子程序计算callmxCopyPtrToReal8(x_pr,x,size)c调用计算子程序call timestwo(y,x)c将结果数据传送到输出矩阵callmxCopyReal8ToPtr(y,y_pr,size)returnendc计算子程序subroutine timestwo(y,x)real38 x,yy=2103xreturnend212利用Matlab引擎实现混合编程这是简单而直接的混合编程方式,Fortran程序通过调用Matlab引擎函数,便可向Matlab发送命令,控制其运行.启动Matlab引擎时,相当于启动了另外一个Matlab进程,该进程在后台运行,用户应用程序通过Matlab引擎函数库提供的函数完成与Matlab引擎的数据交换和命令传递任务.表2列出了常用的引擎函数.混合编程的主要步骤如下:(1)API函数申明,包括引擎函数和访问函数.(2)指针变量的定义,在Matlab与Fortran混合编程中,指针是传递数据的唯一方式.因此,每表2Matlab引擎常用函数Table 2Usual functions ofMatlab engine 函数名称 功 能 说 明engOpen启动Matlab引擎,建立ActiveX通道engClose关闭Matlab引擎engGet Matrix从Matlab引擎中获得矩阵engPut Matrix向Matlab引擎写入矩阵engEvalString执行Matlab命令engOutputBuffer建立一个缓冲区,存储Matlab文本输出77第25卷 第1期 刘羽:Matlab与Fortran的混合编程及其应用一个传递到Matlab中的Fortran数据都需要一个指针来指向其在Matlab中对应的mxArray结构体.(3)启动Matlab引擎.(4)创建输出矩阵.Matlab的基本运算单位是矩阵,因此任何传输到Matlab中的值必须转化成矩阵形式.(5)指定mxArray的名字.(6)将Fortran数组传送至步骤(4)创建的Matlab输出矩阵中.(7)将输出矩阵写入Matlab的工作空间.(8)执行所需的Matlab函数调用.Matlab函数调用的语法由Matlab来检查,Fortran编译程序并不能给出错误信息,因此要特别注意函数调用的书写规则.(9)计算结果返回给Fortran程序,进行后续处理.一个简单例子:Fortran传送一个数组tim e到Matlab的矩阵T,Matlab计算出矩阵D并显示结果曲线(图1),然后将计算结果D传送给Fortran数组dist,最后在Fortran中显示数值计算结果.图1Fortran调用Matlab绘图Fig11Drawing by callingMatlab in Fortranprogram mainc申明API函数integer engOpen,engGet Matrix,mxCreateFull,mxGetPrc申明指针integer ep,T,Ddouble precision time(10),dist(10)integer engPut Matrix,engEvalString,engCloseinteger temp,statusc给time数组赋值data ti me/110,210,310,4.0,5.0,6.0,7.0,8.0,9.0,310.0/c启动Matlab引擎会话ep=engOpen(Matlab)c创建输出矩阵T=mxCreateFull(1,10,0)c给输出矩阵命名,即Matlab中名为TcallmxSetName(T,T)c将数组time复制到输出矩阵TcallmxCopyReal8ToPtr(time,mxGetPr(T),10)c将输出矩阵写入Matlab工作空间call engPut Matrix(ep,T)c调用Matlab函数call engEvalString(ep,D=1513(-918)13T1 2;)call engEvalString(ep,plot(T,D);)call engEvalString(ep,title(Position vs.Time)call engEvalString(ep,xlabel(Time(seconds)call engEvalString(ep,ylabel(Position(meters)c暂停,以便看显示的图形,按任意键继续read(3,3)call engEvalString(ep,close;)从工作空间获取结果矩阵D=engGet Matrix(ep,D)c将结果矩阵复制到数组distcallmxCopyPtrToReal8(mxGetPr(D),dist,10)c进行后续处理print3,Matlab computed the following distances:print3,time(s)distance(m)do 10 i=1,10c显示结果print3,time(i),dist(i)10continuecallmxFreeMatrix(T)callmxFreeMatrix(D)call engClose(ep)stopend3文件的编译和使用无论采用Mex文件还是Matlab引擎混合编程,其代码都必须经过正确的编译才能使用.因此,必须安装Matlab API组件和合适的Fortran语言编译器,如果工作在W indows平台上,编译器还必须支持动态链接库.两种混合编程方式都可以用Mex命令来编译.Matlab API支持多种Fortran编译器,并为不同的编译器提供相应的选项文件(如Compaq Visual For2tran 611使用的选项文件为df60opts1bat),因此在进行文件编译之前,要正确配置好编译器默认选项文件,做法是在Matlab命令窗口中键入mex2setupMatlab会自动寻找系统中已安装的Fortran编译器,只要依提示进行相应选择即可.配置完成后,就可以简单地使用命令mex 87桂 林 工 学 院 学 报 2005年对源文件进行编译生成可执行文件了,该命令使用默认的编译选项文件.也可以采用以下命令mexf 来编译源文件,这样就可以通过选择不同的选项文件来使用相应的编译器.对Matlab引擎程序的编译与Mex文件编译有所不同,并没有默认的选项配置文件,因此编译时必须用Mex命令的-f参数指定选项文件.选项文件名一般为 3 3 3 3engmatopts,前面的 3 号表示所安装的编译器.例如命令mex2f df60engmatopts1bat test1for表明 要 编 译 文 件test1for,采 用 的 选 项 文 件 为df60engmatopts1bat,对应于使用Compaq Visual Fortran611编译器.尽管采用Mex命令进行编译比较简单,但如果程序规模很大,则应该充分利用Fortran编译器的集成编译环境,便于进行调试.此时需要生成静态链接库并进行路径设置.在Matlab安装目录extern include 下有如下文件:libeng1def,libmex1def,lib2mx1def,libmat1def和Matlab1def等,可以在DOS命令窗口下执行Lib命令生成相应的库文件,然后加入到所安装的Fortran编译器的库文件中即可.4应用实例实例1:Ch18r是一个Fortran应用程序,主要功能是从Protem(加拿大GEON ICS公司生产的电磁系统)产生的 1xyz文件中抽取各测点的测量数据,进行相应处理后形成 1dat文件,从而能够通过surf2er软件进行网格化,并形成测线的剖面图.如果输入了多条剖面数据,则可以按时间道抽取平面数据,进而形成各道的异常响应平面图.该程序通过长时间使用,操作简便、效果良好,但由于Fortran绘图功能较弱,在形成 1dat文件后,必须借助Surfer,AutoCAD等图形软件进行图件的生成和绘制,步骤较多,使用起来不够方便.现将该Fortran程序增加Matlab的入口函数,生成Mex文件,使其可以被Matlab直接调用,然后在Matlab中完成数据网格化并直接生成各种图件,操作步骤大为简化.Matlab中网格化采用了griddata函数3,4 Z I=griddata(x,y,z,X I,YI,v4).最后一个参数为网格化方式,这里采用v4方式,以获得一种比较平滑的效果(图2).图2TEM异常响应平面图Fig12Plan of TEM abnormal response实例2:合成地震记录是地震勘探中一个重要的研究内容,制作方法是:根据所设定的地层模型,得到相应地层的波速和密度,依据下式计算反射系数R=2V2-1V12V2+1V1.式中:为地层密度;V为地层波速;V为波阻抗;各参数的下标表示该参数所描述的地层.通过时深转换可以得到随时间变化的反射系数序列,将其与选择的地震子波(如雷克子波)褶积,便可得到合成地震记录,数学表达式为f(t)=R(t)3G(t).式中:R(t)为反射系数序列;G(t)为地震子波;f(t)为合成地震记录.采用Fortran进行速度和密度数据的输入,并计算反射系数序列,然后通过Matlab的计算引擎调用Matlab的褶积函数,计算合成地震记录并显示合成结果(图3).图3 合成地震记录曲线Fig13Synthetical seismogram97第25卷 第1期 刘羽:Matlab与Fortran的混合编程及其应用5 结 论(1)利用Matlab API功能连接Fortran代码,可以在无须做大量改动的情况下,充分利用已有的大量Fortran程序资源,而Matlab强大的图形功能,也能很好地弥补Fortran这方面的不足,甚至还可以替代部分专用图形处理软件,从而使应用程序的功能更为全面、高效.(2)一般来说,利用Mex文件和Matlab引擎混合编程两种方式都能完成类似的工作,但由于各自特点不同,也应该根据实际情况加以选择使用.笔者的经验是:如果Fortran程序中有较多的交互输入,甚至输入的参数个数是动态的,则编写入口子程序会变得比较复杂,此种情况下,应多考虑采用Matlab引擎的混合编程方式;如果Fortran中要调用的Matlab函数较多,这些调用因为都要以字符串传递的方式进行,在编写上就不如直接在Matlab中编写方便,运行效率也相对较低,因此应考虑采用Mex文件的混合编程方式.参考文献1刘志俭.Matlab应用程序接口用户指南M.北京:科学出版社,2000.2何强,何英.Matlab扩展编程M.北京:清华大学出版社,2002.3李强,赵伟.Matlab数据处理与应用M.北京:国防工业出版社,2001.4陈天伟.应用Matlab构造数字高程模型工具箱J.桂林工学院学报,2003,23(4):453-456.Application ofM ixed Programm ing withMatlab and FortranL I U Yu1,2(11Institute of Geophysics and Geom atics,China University of Geoscience,W uhan430074,China;21Departm ent of Electronics and Com puter Science,Guilin University of Technology,Guilin541004,China)Abstract:Two methods ofMatlab and Fortran mixed programming are analyzed and introduced.The Matlabengine and theMex files are used while the realization steps of the t wo methods are presented.The advantageand disadvantage are discussed with a geophysical prospecting data visualization application example.The anal2ysis and the experimental result indicate that throughMatlab and Fortran mixed programming,notonly theMat2lab for midable graph function and the rich engineering calculation function can be used,but also highly effec2tive characteristic can be shown in the Fortran value operation and the massive program resources can be used.Thus it can be shown that the process of programming is highly effective and flexible.If there are too many in2teractive inputs in the Fortran,theMatlab engine mixed programming methods should be appropriate.If a lotofMatlab function to be called in Fortran,theMex file mixed programming should be used.Key words:Matlab;Fortran;mix programming;interface08桂 林 工 学 院 学 报 2005年

    注意事项

    本文(Matlab与Fortran的混合编程及其应用.pdf)为本站会员(qwe****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开