首页 > 范文大全 > 正文

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

开篇:润墨网以专业的文秘视角,为您筛选了一篇Matlab 与Fortran 语言混合编程的接口技术范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

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

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

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

ProgramInterface Technique for Matlab and Fortran Compiling

PENG Yu-shan1,REN Xiang-he2

(1.Shandong Agricultural University,Tai'an 271018,China;2.Shanghai Institute of Optics and Fine Mechanics,Chinese Academy of Sciences,Shanghai 201800,China)

Abstract:In this paperthe theory of using Fortran programme under Matlab environment is discussed.From an example,the interface technique between the two programmes is shown.

Key words:Fortran;Matlab;interface technique;mixing programme

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

1MATLAB 环境的配置

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

>> mex -setup

系统提示

Please choose your compiler for building external interface (MEX) files:

Would you like mex to locate installed compilers [y]/n?

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

Select a compiler:

[1]Compaq Visual Fortran version 6.6 in d:\program

[2] Lcc C version 2.4 in D:\MATLAB7\sys\lcc

[0] None

Compiler:

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

图1

2 FORTRANMEX文件的编写

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

2.1 接口程序

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

subroutine mexFunction(nlhs , plhs,nrhs,prhs)

implicit none

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) then C 判断输入数据个数 本文假设有个输入数据

call mexErrMsgTxt(‘One input required’)

else if (nlhs /=2) then C判断输出数据个数,本文假设有两个输出数据

call mexErrMsgTxt(‘One output required’)

end if

C检查数据的类型

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

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

call mexErrMsgTxt('Input must be a number1')

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

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

call mexErrMsgTxt('Input must be a number1')

end if

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中

call mxCopyPtrToReal8(x_pr,x,size)

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

call mxCopyPtrToReal8(y_pr,y,size)

C调用FORTRAN 计算程序

calltest(x,y,z,w)

C将计算结果返回MATLAB

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

call mxCopyReal8ToPtr(z,z_pr,size)

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

call mxCopyReal8ToPtr(w,w_pr,size)

return

end

2.2计算程序

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

subroutine test(x,y,z,w)

implicit none

real(kind=8) x,y,z,w

z=x*8

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

return

end

C FORTRAN 内部子程序

Functionf(x,y)

implicit none

real(kind=8) x,y,f

f=x*y

return

end

3 FORTRAN MEX文件执行

把上面的接口程序存成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程序的时间。

参考文献:

[1]求实科技.Matlab 7.0 从入门到精通[M].人民邮电出版社,2006.

[2]Stephen J.ChapmanMatlab Programming for Engineers(Second Edition)[M].科学出版社,2003.

[3]王志松.Matlab与Fortran 语言相互调用接口的实现[J].编程语言2001,10.

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。

本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文