第25卷 第1期 桂林工学院学报 Vol.25No.1 2005年1月 JOURNAL OF G U I L I N UN I V ERSI TY OF TECHNOLOGY Jan12005
文章编号:1006-544X(2005)01-0076-05
M a tl ab与Fo rtran的混合编程及其应用
刘羽1,2
(11中国地质大学地球物理与空间信息学院,武汉 430074;21桂林工学院电子与计算机系,广西桂林 541004)
摘 要:介绍和分析了Matlab与Fortran混合编程的两种方式,即利用Mex文件和利用Matlab
引擎;给出了其具体实现方法,并讨论了各自的优缺点和适用情况;给出了一个物探数据可
视化的应用实例.分析和实验结果表明:通过Matlab与Fortran混合编程,不仅可以利用Mat2
lab强大的图形功能和丰富的工程计算函数,还能发挥Fortran数值运算高效的特点和利用其原
有的大量程序资源,从而使编程更为灵活、高效.如Fortran程序中有大量交互输入,宜采用
Matlab引擎混合编程方式;如Fortran中要调用的Matlab函数较多,则应考虑采用Mex文件混
合编程.
关键词:Matlab;Fortran;混合编程;接口
中图分类号:TP311 文献标识码:A
M atlab提供了强大的矩阵运算和图形处理功能以及大量工程计算领域中常用的数值处理函数和高效工具箱,不仅编程效率很高,适合数据处理及结果的可视化,而且在理论和算法上成熟可靠.但由于是一种解释型语言,M atlab也有不足之处,如执行次数较多的循环特别是多层嵌套循环时速度较慢,不太适合做大规模的数值计算和分析[1].Fortran语言是传统的数值处理语言,处理速度高,编程简便,有很多源代码资源可供使用,但绘图功能不强,在可视化方面需要编制复杂的代码.因此,用两种语言混合编程,可以充分利用M atlab中丰富的函数及Fortran语言原有的算法程序,弥补彼此的不足,这已成为当前科学问题和工程问题的一种良好解决方案.
1Matlab与Fortran混合编程及数据传递方式
111 混合编程方式
M atlab提供了多种途径及相应的AP I(应用程序接口)函数实现与其它语言的混合编程,但就Fortran来说,常用的是利用M ex文件和利用M at2 lab引擎两种方式:前者是以M atlab为主调程序,调用Fortran代码编译后的M ex文件,此种方式必须在Matlab环境下运行;后者则是用Fortran设计应用程序框架,以其编译的程序作为前端客户机,通过调用M atlab引擎,实现后台与M atlab服务器的连接和动态通信.此种方式下,程序可在W in2 dows下任何地方运行,但仍需要M atlab在后台运行.因此无论采用哪种方式,运行时都必须具有M atlab的支持.
112数据传递方式
多种语言的混合编程中,最重要的是要解决它们之间的数据传递问题.M atlab和Fortran语言的运算单位不同,前者是基于矩阵(mx A rray结构体),后者是基于数,两者的数据类型无法直接匹配,必须通过M atlab提供的指针变量来进行交互.其基本原理:M atlab首先将需要传递的mx A rray结构体的内存地址作为一个整型数值传给Fortran程序,然后在Fortran程序中调用M atlab引擎提供的访问函数,这些函数自动地将传给它的这个整数值作为地
收稿日期:2004-11-01
基金项目:广西自然科学基金资助项目(桂科基[0339070])
作者简介:刘羽(1961-),男,博士研究生,高级工程师,研究方向:数据处理、并行计算.
址去读取或写入mx A rray结构体中的相应数据.传统的Fortran77不支持指针变量,因此必须借助M atlab的AP I函数来完成传递.若采用的编译器支持%vol结构(如Fortran90),则可省去对AP I函数的调用而直接使用指针数据,效率更高.为更具普遍性,本文以Fortran77为标准进行讨论.
2混合编程
211 利用M e x文件实现混合编程
M ex是M atlab的可执行程序,在W indow s环境中,它是扩展名为DLL的动态链接库,可以在M at2 lab中直接调用[2].Fortran M ex文件通常由两个显著不同的部分组成:(1)计算子程序,是完成计算功能的纯Fortran程序,通常为现有的Fortran程序代码;(2)入口子程序,是计算子程序与M atlab环境之间的接口,用来完成相互之间的调用.
计算子程序实际上被入口子程序当作子程序来调用,如果非常简单,也可以直接嵌入到入口子程序中,但为了保持可读性,一般不建议这么做.
入口子程序名字为mexFuncti on,包含4个虚拟参数:Prhs,输入参数指针;N rhs,输入参数个数;Plhs,输出参数指针;N lhs,输出参数个数.调用格式为: subr outine mexFuncti on(nlhs,p lhs,nrhs,p rhs)
入口子程序要跟M atlab进行数据交换,Matlab 为此提供了1组编写M ex文件的AP I函数,表1列出了Fortran M ex文件的主要AP I函数.
表1 M ex文件常用的AP I函数及功能
Table1 U sual AP I functions in Mex file
函数名称功 能 说 明
mex Function完成Mex文件和Matlab的接口功能mexGet A rray从Matlab中读出矩阵
mexPut A rray向Matlab中写入矩阵
mexGet A rrayPtr获取Matlab工作空间中的矩阵指针mexCall M atlab调用Matlab指令、M函数和其它Mex文件mexErr M sgTxt处理异常情况
mexEvalstring执行字符串所代表的Matlab命令
以下通过一个简单例子来说明Fortran M ex文件的整体结构.该程序用于计算一个数的倍数(省略输入参数检查部分):
c 定义入口子程序
subr outine mexFuncti on(nlhs,p lhs,nrhs,p rhs)
c 定义输入、输出指针,AP I函数
integer p lhs(3),p rhs(3)
integer mxGetPr,mxCreateFull
integer x_p r,y_p r
integer nlhs,nrhs
integer mxGet M,mxGet N,mxIs Nu meric
integer m,n,size
real38x,y
m=mxGet M(p rhs(1))
n=mxGet N(p rhs(1))
c 计算输入数据的大小
size=m3n
c产生输出矩阵
p lhs(1)=mxCreateFull(m,n,0)
c获取输入参数指针
x_p r=mxGetPr(p rhs(1))
c获取输出参数指针
y_p r=mxGetPr(p lhs(1))
c将输入数据传送到x以便计算子程序计算
call mxCopyPtrToReal8(x_p r,x,size)
c调用计算子程序
call ti m est w o(y,x)
c将结果数据传送到输出矩阵
call mxCopyReal8ToPtr(y,y_p r,size)
return
end
c计算子程序
subr outine ti m est w o(y,x)
real38x,y
y=2103x
return
end
212利用M a tla b引擎实现混合编程
这是简单而直接的混合编程方式,Fortran程序通过调用M atlab引擎函数,便可向M atlab发送命令,控制其运行.启动M atlab引擎时,相当于启动了另外一个Matlab进程,该进程在后台运行,用户应用程序通过M atlab引擎函数库提供的函数完成与M atlab引擎的数据交换和命令传递任务.表2列出了常用的引擎函数.
混合编程的主要步骤如下:
(1)AP I函数申明,包括引擎函数和访问函数.
(2)指针变量的定义,在M atlab与Fortran混合编程中,指针是传递数据的唯一方式.因此,每
表2 M a tl a b引擎常用函数
Table2 U sual functions of Matlab engine
函数名称 功 能 说 明
eng Open启动Matlab引擎,建立ActiveX通道engClose关闭Matlab引擎
engGet M atrix从Matlab引擎中获得矩阵
engPut M atrix向Matlab引擎写入矩阵engEvalString执行Matlab命令
eng Output Buffer建立一个缓冲区,存储Matlab文本输出
77
第25卷 第1期 刘羽:Matlab与Fortran的混合编程及其应用
一个传递到M atlab 中的Fortran 数据都需要一个指针来指向其在M atlab 中对应的mx A rray 结构体.
(3)启动M atlab 引擎.
(4)创建输出矩阵.M atlab 的基本运算单位
是矩阵,因此任何传输到M atlab 中的值必须转化成矩阵形式.
(5)指定mx A rray 的名字.
(6)将Fortran 数组传送至步骤(4)创建的M atlab 输出矩阵中.
(7)将输出矩阵写入M atlab 的工作空间.(8)执行所需的M atlab 函数调用.M atlab 函
数调用的语法由M atlab 来检查,Fortran 编译程序并不能给出错误信息,因此要特别注意函数调用的书写规则.
(9)计算结果返回给Fortran 程序,进行后续处理.
一个简单例子:Fortran 传送一个数组ti m e 到
M atlab 的矩阵T ,M atlab 计算出矩阵D 并显示结果
曲线(图1),然后将计算结果D 传送给Fortran 数组dist ,
最后在Fortran 中显示数值计算结果.
图1 Fo rtran 调用M a tl ab 绘图
Fig 11 D rawing by calling Matlab in Fortran
p r ogra m main
c 申明AP I 函数integer eng Open,engGet M atrix,mx CreateFull,mxGetPr
c
申明指针
vs编程软件integer ep,T,D
double p recisi on ti m e (10),dist (10)integer engPut M atrix,engEvalString,engCl ose integer te mp,status c
给ti m e 数组赋值data ti m e /110,210,310,4.0,5.0,6.0,7.0,8.0,9.0,310.0/
c 启动Matlab 引擎会话
ep =eng Open (′Matlab ′
)c
创建输出矩阵
T =mxCreateFull (1,10,0)
c 给输出矩阵命名,即Matlab 中名为T
call mxSet N a me (T,′T ′
)c 将数组ti m e 复制到输出矩阵T
call mxCopyReal8ToPtr (ti m e,mxGetPr (T ),10)c 将输出矩阵写入Matlab 工作空间call engPut M atrix (ep,T )c
调用Matlab 函数
call engEvalString (ep,′D =1513(-918)13T 1^2;′
)call engEvalString (ep,′p l ot (T,D );′
)
call engEvalString (ep,′title (″Positi on vs .Ti m e ″)′)call engEvalString (ep,′xlabel (″Ti m e (seconds )″)′)call engEvalString (ep,′ylabel (″Positi on (meters )″
)′)c
暂停,以便看显示的图形,按任意键继续read (3,3)
call engEvalString (ep,′cl ose;′
)从工作空间获取结果矩阵D =engGet M atrix (ep,′D ′
)c 将结果矩阵复制到数组dist
call mxCopyPtrToReal8(mxGetPr (D ),dist,10)
c
进行后续处理p rint 3,′Matlab computed the foll owing distances:′p rint 3,′ti m e (s )distance (m )′
do 10i =1,10
c 显示结果
p rint 3,ti m e (i ),dist (i )
10
continue
call mxFree Matrix (T )call mxFree Matrix (D )call engCl ose (ep )st op end
3文件的编译和使用
无论采用M ex 文件还是M atlab 引擎混合编程,
其代码都必须经过正确的编译才能使用.因此,必
须安装M atlab AP I 组件和合适的Fortran 语言编译器,如果工作在W indows 平台上,编译器还必须支
持动态链接库.两种混合编程方式都可以用M ex 命令来编译.M atlab AP I 支持多种Fortran 编译器,并为不同的编译器提供相应的选项文件(如Compaq V isual For 2tran 611使用的选项文件为df60op ts 1bat ),因此在
进行文件编译之前,要正确配置好编译器默认选项文件,做法是在M atlab 命令窗口中键入
mex 2setup
M atlab 会自动寻系统中已安装的Fortran 编译器,
只要依提示进行相应选择即可.
配置完成后,就可以简单地使用命令
mex <;源文件名>
87桂 林 工 学 院 学 报 2005年
对源文件进行编译生成可执行文件了,该命令使用默认的编译选项文件.也可以采用以下命令mex∃f<;选项文件名><;源文件名>
来编译源文件,这样就可以通过选择不同的选项文件来使用相应的编译器.
对M atlab引擎程序的编译与M ex文件编译有所不同,并没有默认的选项配置文件,因此编译时必须用M ex命令的-f参数指定选项文件.选项文件名一般为3333eng mat op ts,前面的3号表示所安装的编译
器.例如命令
mex2f df60eng mat op ts1bat test1f or
表明要编译文件test1f or,采用的选项文件为df60eng mat op ts1bat,对应于使用Co mpaq V isual Fortran 611编译器.
尽管采用M ex命令进行编译比较简单,但如果程序规模很大,则应该充分利用Fortran编译器的集成编译环境,便于进行调试.此时需要生成静态链接库并进行路径设置.在M atlab安装目录\extern\ include\下有如下文件:libeng1def,libmex1def,lib2 mx1def,libmat1def和M atlab1def等,可以在DOS命令窗口下执行L ib命令生成相应的库文件,然后加入到所安装的Fortran编译器的库文件中即可.
4应用实例
实例1:Ch18r是一个Fortran应用程序,主要功能是从Pr ote m(加拿大GEON I CS公司生产的电磁系统)产生的1xyz文件中抽取各测点的测量数据,进行相应处理后形成1dat文件,从而能够通过surf2 er软件进行网格化,并形成测线的剖面图.如果输入了多条剖面数据,则可以按时间道抽取平面数据,进而形成各道的异常响应平面图.该程序通过长时间使用,操作简便、效果良好,但由于Fortran绘图功能较弱,在形成1dat文件后,必须借助Surfer, Aut oCAD等图形软件进行图件的生成和绘制,步骤较多,使
用起来不够方便.现将该Fortran程序增加M atlab的入口函数,生成M ex文件,使其可以被M atlab直接调用,然后在M atlab中完成数据网格化并直接生成各种图件,操作步骤大为简化.Matlab 中网格化采用了griddata函数[3,4]
Z I=gridda ta(x,y,z,X I,Y I,′v4′).
最后一个参数为网格化方式,这里采用v4方式,以获得一种比较平滑的效果(图2)
.
图2 TE M异常响应平面图
Fig12 Plan of TE M abnor mal res ponse
实例2:合成地震记录是地震勘探中一个重要的研究内容,制作方法是:根据所设定的地层模型,得到相应地层的波速和密度,依据下式计算反射系数
R=
ρ
2
V2-ρ1V1
ρ
2
V2+ρ1V1
.
式中:ρ为地层密度;V为地层波速;ρV为波阻抗;各参数的下标表示该参数所描述的地层.
通过时深转换可以得到随时间变化的反射系数序列,将其与选择的地震子波(如雷克子波)褶积,便可得到合成地震记录,数学表达式为
f(t)=R(t)3G(t).
式中:R(t)为反射系数序列;G(t)为地震子波;f(t)为合成地震记录.
采用Fortran进行速度和密度数据的输入,并计算反射系数序列,然后通过M atlab的计算引擎调用M atlab的褶积函数,计算合成地震记录并显示合成结果(图3).
图3 合成地震记录曲线
Fig13 Synthetical seis mogram
97
第25卷 第1期 刘羽:Matlab与Fortran的混合编程及其应用
5 结 论
(1)利用M atlab AP I功能连接Fortran代码,可以在无须做大量改动的情况下,充分利用已有的大量Fortran程序资源,而M atlab强大的图形功能,也能很好地弥补Fortran这方面的不足,甚至还可以替代部分专用图形处理软件,从而使应用程序的功能更为全面、高效.
(2)一般来说,利用M ex文件和M atlab引擎混合编程两种方式都能完成类似的工作,但由于各自特点不同,也应该根据实际情况加以选择使用.
笔者的经验是:如果Fortran程序中有较多的交互输入,甚至输入的参数个数是动态的,则编写入口子程序会变得比较复杂,此种情况下,应多考虑采用M atlab引擎的混合编程方式;如果Fortran中要调用的M atlab函数较多,这些调用因为都要以字符串传递的方式进行,在编写上就不如直接在M atlab中编写方便,运行效率也相对较低,因此应考虑采用M ex文件的混合编程方式.
参考文献
[1]刘志俭.Matlab应用程序接口用户指南[M].北京:科
学出版社,2000.
[2]何强,何英.Matlab扩展编程[M].北京:清华大学出
版社,2002.
[3]李强,赵伟.Matlab数据处理与应用[M].北京:国防
工业出版社,2001.
[4]陈天伟.应用Matlab构造数字高程模型工具箱[J].桂
林工学院学报,2003,23(4):453-456.
Appli ca ti on of M i xed Programm i n g w ith M a tl ab and Fortran
L I U Yu1,2
(11Institu te of Geophysics and Geo m atics,China U niversity of Geoscience,W uhan430074,China;
21D epart m ent of E lectronics and Co m puter S cience,Guilin U niversity of Technology,Guilin541004,China)
Abstract:T wo methods of M atlab and Fortran m ixed p r ogra mm ing are analyzed and intr oduced.The M atlab engine and the M ex files are used while the realizati on step s of the t w o meth
ods are p resented.The advantage and disadvantage are discussed with a geophysical p r os pecting data visualizati on app licati on exa mp le.The anal2 ysis and the experi m ental result indicate that thr ough M atlab and Fortran m ixed p r ogra mm ing,not only the M at2 lab for m idable graph functi on and the rich engineering calculati on functi on can be used,but als o highly effec2 tive characteristic can be shown in the Fortran value operati on and the massive p r ogra m res ources can be used. Thus it can be shown that the p r ocess of p r ogra mm ing is highly effective and flexible.I f there are t oo many in2 teractive inputs in the Fortran,the M atlab engine m ixed p r ogra mm ing methods should be app r op riate.I f a l ot of M atlab functi on t o be called in Fortran,the M ex file m ixed p r ogra mm ing should be used.
Key words:M atlab;Fortran;m ix p r ogra mm ing;interface
08桂 林 工 学 院 学 报 2005年
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论