当前位置:首页 > 思想汇报 > 微机原理与接口技术答案 Matlab 与Fortran 语言混合编程的接口技术
 

微机原理与接口技术答案 Matlab 与Fortran 语言混合编程的接口技术

发布时间:2019-01-11 03:58:29 影响了:

  摘要:阐述了在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浏览器用户请先下载安装 原版全文

猜你想看
相关文章

Copyright © 2008 - 2022 版权所有 职场范文网

工业和信息化部 备案号:沪ICP备18009755号-3