Matlab与Fortran的混合编程及其应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第 25 卷 第 1 期 2 00 5 年 1 月
桂 林 工 学 院 学 报
JOURNA L OF GU IL I N UN I V ERS I TY O F TECHNOLOGY
V o.l 25 N o . 1 Jan 2005
文章编号: 1006- 544X ( 2005) 01- 0076- 05
Matlab与 Fortran的混合编程及其应用

( 1 中国地质大学 地球物理与空间信息学院, 武汉

1 ,2
430074 ; 2 桂林工学院 电子与计算机系 , 广西 桂林
541004)
摘 要 : 介绍和分析了 M atlab与 Fortran混合编程的两种方式 , 即利用 M ex文件和利用 M atlab 引擎; 给出了其具体实现方法 , 并讨论了各自的优缺点和适用情况; 给出了一个物探数据可 视化的应用实例. 分析和实验结果表明: 通过 M atlab与 Fortran混合编程, 不仅可以利用 M at lab强大的图形功能和丰富的工程计算函数, 还能发挥 Fortran数值运算高效的特点和利用其原 有的大量程序资源 , 从而使编程更为灵活、高效. 如 Fortran程序中有大量交互输入, 宜采用 M atlab引擎混合编程方式; 如 Fortran中要调用的 M atlab函数较多 , 则应考虑采用 M ex 文件混 合编程 . 关键词 : M atlab; Fortran; 混合编程; 接口 中图分类号 : TP311 文献标识码 : Ay
c 给输出矩阵命名, 即 M atlab中名为 T callm xSet N am e( T, T ) c 将数组 tm i e复制到输出矩阵 T callm xCopyReal8T oPtr( tm i e , m xG etP r( T), 10 ) c 将输出矩阵写入 M atlab工作空间 call engPuM t atrix( ep , T) c 调用 M atlab函数 call engEvalString( ep, D= 5 * ( - 9 8) * T ^2 ; ) call engEvalString( ep, p lot( T, D); ) call engEvalString( ep, title( Position vs . Tm i e) ) call engEvalString( ep, x label( T m i e ( seconds) ) ) call engEvalString( ep, ylabel( Position ( m eters) ) ) c 暂停, 以便看显示的图形, 按任意键继续 read( * , * ) call engEvalString( ep, close ; ) 从工作空间获取结果矩阵 D = engGeM t atrix( ep , D ) c 将结果矩阵复制到数组 d ist callm xCopyP tr T oReal8( m xG etPr( D) , d is, t 10) c 进行后续处理 prin t* , M atlab com pu ted the follow ing d istances : prin t* , tm i e( s) distance( m ) do 10 i= 1, 10 c 显示结果 prin t* , tm i e( i) , d ist( i) 10 con tinue callm xFree M atrix( T) callm xFree M atrix( D) call engC lose( ep) stop end
启动了另外一个 M atlab 进程, 该进程在后台运行 , 用户应用程序通过 M atlab 引擎函数库提供的函数 完成与 M atlab 引擎的数 据交换和命令 传递任务 . 表 2列出了常用的引擎函数. 混合编程的主要步骤如下 : ( 1) AP I函数申明 , 包括引擎函数和访问函数. ( 2) 指针变量的定义 , 在 M atlab 与 Fortran 混 合 编程中 , 指针是 传递数据的唯 一方式 . 因此 , 每
. F ortran 语言是传统的数值 处理语言, 处
理速度高, 编程简便 , 有很多源代 码资源可供使 用 , 但绘图功能不强 , 在可视化方 面需要编制复 杂的代码 . 因此, 用两种语言混 合编程, 可以充 分利用 M atlab 中丰富的函数及 F ortran 语言原有的 算法程序, 弥补彼此 的不足, 这已 成为当前科学 问题和工程问题的一种良好解决方案 .
表 1 M ex文件常用的 AP I函数及功能
Table 1 U sua lAPI functions inM ex file 函数名称 m ex Function m exG et A rray m exPutA rray m exG et A rrayP tr m exCa lM l atlab m exE rr M sgTx t m exEvalstr ing 功 能 说 明 完成 M ex文件和 M atlab的接口功能 从 M atlab中读出矩阵 向 M atlab中写入矩阵 获取 M atlab 工作空间中的矩阵指针 调用 M atlab 指令、 M 函数和其它 M ex文件 处理异常情况 执行字符串所代表的 M atlab 命令
78





学 报
2005年
一个传递到 M atlab 中的 Fortran 数据都需要一个指 针来指向其在 M a tlab 中对应的 m xA rray 结构体. ( 3) 启动 M at lab引擎. ( 4) 创建输出矩 阵. M atlab 的 基本运算单位 是矩阵, 因此任何传输到 M atlab 中的值必须转化 成矩阵形式 . ( 5) 指定 mxArray 的名字 . ( 6) 将 Fortran 数组传送至步骤 ( 4) 创建的 M atlab 输出矩阵中. ( 7) 将输出矩阵写入 M atlab 的工作空间. ( 8) 执行所需的 M at la b 函数调用. M atlab 函 数调用的语法由 M atlab 来检查 , F ortran 编译程序 并不能给出错误信息 , 因此要特别注意函数调用 的书写规则 . ( 9)计算结果返回给 Fortran 程序, 进行后续处理. 一个简单例子 : Fortran 传送一 个数组 ti m e到 M atlab 的矩阵 T, M atlab 计算出矩阵 D 并显示结果 曲线 (图 1), 然后将 计算结果 D 传 送给 Fo rtran 数 组 d ist, 最后在 Fortran 中显示数值计算结果 .
[ 1]
Fo rtran 来说 , 常用的是利用 M ex 文件和利用 M at lab 引擎两种方式 : 前者是以 M at la b 为主调程序 , 调用 Fortran代码编译后的 M ex 文件 , 此种方式必 须在 M atlab 环境下运行; 后者则是用 Fortran 设计 应用程序框架, 以其编译的程序作为前端客户机 , 通过调用 M atlab 引擎 , 实现后台与 M atlab 服务器 的连接和动态通信. 此种方式下 , 程序可在 W in dow s下任何地方运行 , 但仍需要 M at la b 在后台运 行 . 因此无论采用哪 种方式, 运 行时都必须具 有 M atlab 的支持 . 1 2 数据传递方式 多种语言的混合编程中 , 最重要的是要解决它 们之间的数据传递问题. M atlab 和 Fortran 语言的运 算单位不同, 前者是基于矩阵 ( m xA rray 结构体 ) , 后者是基于数 , 两者 的数据类型无法直接匹配 , 必 须通过 M atlab 提供的指针变量来进行交互 . 其基本 原理: M at la b首先将需要传递的 m xA rray 结构体的 内存地址作为一个整型数值传给 F ortran 程序, 然后 在 F ortran 程序 中调用 M at lab 引擎提 供的 访问 函 数 , 这些函数自动地将传给它的这个整数值作为地
以下通过一个简单例子来说明 Fortran M ex 文 件的整体 结 构. 该程 序 用 于计 算 一个 数 的 倍数 ( 省略输入参数检查部分 ) :
c 定义入口子程序 subroutine m exFunction( n lhs , p lhs , nrhs , prhs) c 定义输入、 输出指针, AP I函数 integer p lhs(* ), prhs(* ) integerm xGetPr , m xC reateFu ll
1 M atlab 与 Fortran 混合编程及数据 传递方式
1 1 混合编程方式 M atlab 提供了多种途径及相应的 AP I (应用程 序接口 ) 函数实现与其它语言的混合编程 , 但就
y
收稿日期 : 2004- 11- 01 基金项目 : 广西自然科学基金资助项目 ( 桂科基 [ 0339070] ) 作者简介 : 刘 羽 ( 1961- ), 男 , 博士研究生, 高级工程师 , 研究方向: 数据处理、并行计算.
表 2 Ma tlab引擎常用函数
Table 2 U sua l functions ofM atlab eng ine 函数名称 eng O pen engClose eng G eM t atr ix engPuM t atrix engEva lString eng O utputBuffer 功 能 说 明 启动 M a tlab引擎, 建立 A ctive X 通道 关闭 M a tlab引擎 从 M atlab 引擎中获得矩阵 向 M atlab 引擎写入矩阵 执行 M a tlab命令 建立一个缓冲区, 存储 M atlab 文本输出
77
址去读取或写入 m xA rray 结构体中的相应数据 . 传 统的 Fortran 77 不 支持 指针 变量 , 因 此 必须 借助 M atlab 的 AP I函数来完成传递. 若采用的编译器支 持 % vo l结构 (如 Fo rtran 90), 则可省去对 AP I 函数 的调用而直接使用指针数据 , 效率更高. 为更具普 遍性, 本文以 F ortra tlab引擎实现混合编程
这是简单而直接的混 合编程方式, Fo rtran 程 为此提供了 1 组编写 M ex 文件的 AP I 函数 , 表 1 序通过调用 M atlab 引擎函数, 便可向 M atlab 发送 列出了 Fo rtran M ex 文件的主要 AP I函数. 命令, 控制其运行 . 启 动 M atlab 引擎时 , 相当 于
M atlab 提供了 强大的矩阵运算 和图形处理功 能以及大量工程计算领域中常用的数值处理函数 和高效工具箱, 不仅 编程效率很高 , 适合数据处 理及结果的可视化 , 而且在理论和算法上成熟可 靠 . 但由于是一种 解释型语 言, M atlab 也有不足 之处, 如执行次数较多的循环特别是多层嵌套循 环时速度较慢 , 不太适合做大规模的数值计算和 分析
定义入口子程序subroutinemexfunctionnlhsplhsnrhsprhs定义输入输出指针api函数integerplhsprhsintegermxgetprmxcreatefullintegerxpryprintegernlhsnrhsintegermxgetmmxgetnmxlsnumericintegermnsizereal8xynlmxgetmprhs1nmxgetnprhs1计算输入数据的大小sizenln产生输出矩阵plhs1mxcreatefullinn0获取输人参数指针xprmxgetprprhs1获取输出参数指针yprmxgetprplhs1将输人数据传送到x以便计算子程序计算callmxcopyptrtoreal8xprxsize调用计算子程序calltimestwoyx将结果数据传送到输出矩阵callmxcopyreal8toptryyprsizeretumend计算子程序subroutinetimestwoyxreal8xyy20xretumend22利用matlab引擎实现混合编程这是简单而直接的混合编程方式fortran序通过调用matlab引擎函数便可向maflab发送命令控制其运行
c c c c c c c
2
混合编程
M ex 是 M atlab 的可执行程序 , 在 W indow s 环境
2 1 利用 M ex文件实现混合编程 中 , 它是扩展名为 DLL 的动态链接库 , 可以在 M at lab 中直接调用
[ 2]
. Fortran M ex 文件通常由两个显
著不同的部分组成: ( 1) 计算子程序 , 是完成计算功 能的纯 Fo rtran 程序, 通常为现有的 Fortran 程序代 码 ; ( 2) 入口子程序, 是计算子程序与 M at lab环境之 间的接口, 用来完成相互之间的调用 . 计算子程序实际上被入口子程序当作子程序 来调用 , 如果非常简单 , 也可以直接嵌入到入口子 程序中 , 但为了保持可读性 , 一般不建议这么做 . 入口子程序名字为 m exFunct ion, 包含 4 个虚拟 参数 : P rhs, 输入参数指针 ; Nrhs , 输入参数个数; P lh s , 输出参数指针; N lh s , 输出参数个数. 调用格式为: subroutin e m exFunction( nlhs, p lh s , nrhs , prhs) 入口子程序要跟 M atlab 进行数据交换 , M at lab
第 25卷
第 1期
刘 羽 : M atlab与 Fortran的混合编程及其应用 integer x_p r , y_pr integer n lh s , n rhs integerm xG eM t , m xGet N, m xIs N um eric integerm, n, size rea* l 8x , y m = m xG eM t ( prhs( 1) ) n= m xG etN( prhs( 1) ) 计算输入数据的大小 size= m* n 产生输出矩阵 p lhs( 1) = m xC reateFull( m, n , 0) 获取输入参数指针 x_pr= m xG etPr( prhs( 1) ) 获取输出参数指针 y_pr= m xG etPr( plhs( 1) ) 将输入数据传送到 x 以便计算子程序计算 callm xCopyP tr T oReal8( x_p r , x , size) 调用计算子程序 call tm i est w o( y , x) 将结果数据传送到输出矩阵 callm xCopyReal8T oPtr( y , y_pr , size) return end 计算子程序 sub routine tm i est w o( y , x) rea* l 8x , y y= 2 0 * x return end
相关文档
最新文档