Matlab与Fortran语言混合编程的接口技术

点赞:31213 浏览:143694 近期更新时间:2024-01-21 作者:网友分享原创网站原创

摘 要:阐述了在matlab环境下,调用Fortran语言的原理,并通过一实例说明如何实现Matlab,Fortran两种语言的混合编程.

关 键 词:Fortran;Matlab;接口技术;混合编程

中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)18-31643-01

ProgramInterfaceTechniqueforMatlabandFortranCompiling

PENGYu-shan1,RENXiang-he2

(1.ShandongAgriculturalUniversity,Tai'an271018,China,2.ShanghaiInstituteofOpticsandFineMechanics,ChineseAcademyofSciences,Shanghai201800,China)

Abstract:InthispaperthetheoryofusingFortranprogrammeunderMatlabenvironmentisdiscussed.Fromanexample,theinterfacetechniquebetweenthetwoprogrammesisshown.

Keywords:Fortran,Matlab,interfacetechnique,mixingprogramme

MATLAB是当今流行的科学计算软件,专门以矩阵的形式处理数据,它把数值计算和可视化环境集成到一起,许多用户在使用时希望能够直接调用过去的FORTRAN经典计算程序.虽然MATLAB没有现成的接口程序,但其提供的标准API工具,使用户能够根据需要来编写接口程序,完成MATLAB与其它外部程序的通讯.下面本文就以具体实例来说明如何编写完整的MATLAB与FORTRAN的接口程序.

1MATLAB环境的配置

MEX文件是MATLAB语言的外部程序调用接口,它可以调用外部的FORTRAN程序.要调用外部的FORTRAN程序,必须先用MEX命令来搭建MATLAB调用FORTRAN的平台,具体步骤为:在MATLAB命令提示符下键入命令

Matlab与Fortran语言混合编程的接口技术参考属性评定
有关论文范文主题研究: 关于数据的论文范文集 大学生适用: 本科论文、学年论文
相关参考文献下载数量: 27 写作解决问题: 如何怎么撰写
毕业论文开题报告: 论文任务书、论文选题 职称论文适用: 杂志投稿、高级职称
所属大学生专业类别: 如何怎么撰写 论文题目推荐度: 经典题目

>>mex-setup

系统提示

Pleasechooseyourpilerforbuildingexternalinterface(MEX)files:

Wouldyoulikemextolocateinstalledpilers[y]/n

然后键入y,回车,系统又会提示:

Selectapiler:

[1]CompaqVisualFortranversion6.6ind:\program

[2]LccCversion2.4inD:\MATLAB7\sys\lcc

[0]None

Compiler:

在Compiler:后面输入1,回车,再按系统提示就会完成平台的搭建.如图1所示.系统配置完成后,就可以使用命令mexmyfunction调用FORTRAN程序.

图1

2FORTRANMEX文件的编写

FORTRAN语言的MEX文件有两部分组成:接口程序和计算程序.

2.1接口程序

接口程序可以完成两项任务:第一是从输入的参数中获得计算所需要的数据;第二是把计算的结果返回MATLAB.这样接口程序就完成了MATLAB与FORTRAN语言之间通讯任务.

subroutinemexFunction(nlhs,plhs,nrhs,prhs)

implicitnone

integerplhs(*),prhs(*)

integermxGetpr,mxGreatFull

integerx_pr,y_pr,y_pr,w_pr,nlhs,plhs,m,n,size

real(kind等于8)x,y,z,w

C参数nlhs,nrhs分别代表输出和输入数据的个数;plhs,prhs,分别代表输出和

C输入数据的指针,(*)代表参数长度不确定要根据实际情况而定.

if(nrhs/等于2)thenC判断输入数据个数本文检测设有个输入数据

callmexErrMsgTxt(‘Oneinputrequired’)

elseif(nlhs/等于2)thenC判断输出数据个数,本文检测设有两个输出数据

callmexErrMsgTxt(‘Oneoutputrequired’)

endif

C检查数据的类型

if(mxIsNumeric(prhs(1)).ne.1)then

Cprhs(1)为第一个数据的指针

callmexErrMsgTxt('Inputmustbeanumber1')

elseif(mxIsNumeric(prhs(2)).ne.1)then

Cprhs(2)为第二个数据的指针

callmexErrMsgTxt('Inputmustbeanumber1')

endif

C获取输入数据的大小

m等于mxGetM(prhs(2))

n等于mxGetN(prhs(2))

C产生输出数组

plhs(1)等于mxCreateFull(m,n,0)C输出数据的指针

plhs(2)等于mxCreateFull(m,n,0)

C读取第一个输入数据地址并放在指针x_pr中

x_pr等于mxGetPr(prhs(1))

C读取第二个输入数据地址并放在指针y_pr中

y_pr等于mxGetPr(prhs(2))

C读取第一个输出数据地址并放在指针z_pr中

z_pr等于mxGetPr(plhs(1))

C读取第二个输出数据地址并放在指针w_pr中

w_pr等于mxGetPr(plhs(2))

C将计算结果转换成指针返回到MATLAB

C从第一个输入数据地址读取数值并返回x中

callmxCopyPtrToReal8(x_pr,x,size)

C从第二个输入数据地址读取数值并返回y中

callmxCopyPtrToReal8(y_pr,y,size)

C调用FORTRAN计算程序

calltest(x,y,z,w)

C将计算结果返回MATLAB

C从第一个计算数据z输出到指针z_pr

callmxCopyReal8ToPtr(z,z_pr,size)

C从第二个计算数据w输出到指针w_pr

callmxCopyReal8ToPtr(w,w_pr,size)

return

end

2.2计算程序

计算程序主要完成你所需要的计算任务,它是完全是用FORTRAN写的,而且在这一部分FORTRAN还可以调用自己的子程序.这一部分要和接口程序并存于一个文件里.

subroutinetest(x,y,z,w)

implicitnone

real(kind等于8)x,y,z,w

z等于x*8

w等于f(x,y)CFORTRAN内部子程序

return

end

CFORTRAN内部子程序

Functionf(x,y)

implicitnone

real(kind等于8)x,y,f

f等于x*y

return

end

3FORTRANMEX文件执行

把上面的接口程序存成myfunction.f到MATLAB的work的文件里.在MATLAB命令窗口运行

>>mexmyfunction


>>x等于2.0%初始输入值

>>y等于7.8%初始输入值

>>[z,w]等于test(x,y)%调用FORTRAN里的test子程序,z,w是输出数据;x,y是输

%变量;而且prhs(1)就是输入数据x的指针,prhs(2)就是输入数%据y的指针;plhs(1)就是输出数据z的指针,plhs(2)就是输出

%数据w的指针.

运行后的结果为

z等于16

w等于15.6

4结束语

本文详细地介绍的FORTRAN和MATLAB混合编程的接口问题,并给出了有多个输入输出数据.有了接口程序可以使MATLAB使用者方便地调用FORTRAN程序,这样可以大大提高MATLAB计算效率,节省了很多重新写已有FORTRAN程序的时间.