Matlab与Fortran的混合编程及其应用.pdf
《Matlab与Fortran的混合编程及其应用.pdf》由会员分享,可在线阅读,更多相关《Matlab与Fortran的混合编程及其应用.pdf(5页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第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引擎;给出了其具体实现方法,并讨论了各自的优缺点和适用情况;给出了一个物
2、探数据可视化的应用实例.分析和实验结果表明:通过Matlab与Fortran混合编程,不仅可以利用Mat2lab强大的图形功能和丰富的工程计算函数,还能发挥Fortran数值运算高效的特点和利用其原有的大量程序资源,从而使编程更为灵活、高效.如Fortran程序中有大量交互输入,宜采用Matlab引擎混合编程方式;如Fortran中要调用的Matlab函数较多,则应考虑采用Mex文件混合编程.关键词:Matlab;Fortran;混合编程;接口中图分类号:TP311 文献标识码:AMatlab提供了强大的矩阵运算和图形处理功能以及大量工程计算领域中常用的数值处理函数和高效工具箱,不仅编程效率很
3、高,适合数据处理及结果的可视化,而且在理论和算法上成熟可靠.但由于是一种解释型语言,Matlab也有不足之处,如执行次数较多的循环特别是多层嵌套循环时速度较慢,不太适合做大规模的数值计算和分析1.Fortran语言是传统的数值处理语言,处理速度高,编程简便,有很多源代码资源可供使用,但绘图功能不强,在可视化方面需要编制复杂的代码.因此,用两种语言混合编程,可以充分利用Matlab中丰富的函数及Fortran语言原有的算法程序,弥补彼此的不足,这已成为当前科学问题和工程问题的一种良好解决方案.1Matlab与Fortran混合编程及数据传递方式111 混合编程方式Matlab提供了多种途径及相应
4、的API(应用程序接口)函数实现与其它语言的混合编程,但就Fortran来说,常用的是利用Mex文件和利用Mat2lab引擎两种方式:前者是以Matlab为主调程序,调用Fortran代码编译后的Mex文件,此种方式必须在Matlab环境下运行;后者则是用Fortran设计应用程序框架,以其编译的程序作为前端客户机,通过调用Matlab引擎,实现后台与Matlab服务器的连接和动态通信.此种方式下,程序可在W in2dows下任何地方运行,但仍需要Matlab在后台运行.因此无论采用哪种方式,运行时都必须具有Matlab的支持.112数据传递方式多种语言的混合编程中,最重要的是要解决它们之间的
5、数据传递问题.Matlab和Fortran语言的运算单位不同,前者是基于矩阵(mxArray结构体),后者是基于数,两者的数据类型无法直接匹配,必须通过Matlab提供的指针变量来进行交互.其基本原理:Matlab首先将需要传递的mxArray结构体的内存地址作为一个整型数值传给Fortran程序,然后在Fortran程序中调用Matlab引擎提供的访问函数,这些函数自动地将传给它的这个整数值作为地收稿日期:2004-11-01基金项目:广西自然科学基金资助项目(桂科基0339070)作者简介:刘羽(1961-),男,博士研究生,高级工程师,研究方向:数据处理、并行计算.址去读取或写入mxAr
6、ray结构体中的相应数据.传统的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程序代
7、码;(2)入口子程序,是计算子程序与Matlab环境之间的接口,用来完成相互之间的调用.计算子程序实际上被入口子程序当作子程序来调用,如果非常简单,也可以直接嵌入到入口子程序中,但为了保持可读性,一般不建议这么做.入口子程序名字为mexFunction,包含4个虚拟参数:Prhs,输入参数指针;Nrhs,输入参数个数;Plhs,输出参数指针;Nlhs,输出参数个数.调用格式为:subroutine mexFunction(nlhs,plhs,nrhs,prhs)入口子程序要跟Matlab进行数据交换,Matlab为此提供了1组编写Mex文件的API函数,表1列出了FortranMex文件的主要
8、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文件的整体结构.该
9、程序用于计算一个数的倍数(省略输入参数检查部分):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产生输出矩阵plh
10、s(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引擎实现混合编程这是简单而直接的混合
11、编程方式,Fortran程序通过调用Matlab引擎函数,便可向Matlab发送命令,控制其运行.启动Matlab引擎时,相当于启动了另外一个Matlab进程,该进程在后台运行,用户应用程序通过Matlab引擎函数库提供的函数完成与Matlab引擎的数据交换和命令传递任务.表2列出了常用的引擎函数.混合编程的主要步骤如下:(1)API函数申明,包括引擎函数和访问函数.(2)指针变量的定义,在Matlab与Fortran混合编程中,指针是传递数据的唯一方式.因此,每表2Matlab引擎常用函数Table 2Usual functions ofMatlab engine 函数名称 功 能 说 明e
12、ngOpen启动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的基本运算单位是矩阵,因此任何传输到Mat
13、lab中的值必须转化成矩阵形式.(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中显示数值计
14、算结果.图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.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Matlab Fortran 混合 编程 及其 应用
限制150内