版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第 26卷 第 6期 2004年 12月 三峡大学学报 (自然科学版 J of China Three G orges Univ. (Natural Sciences Vol. 26 No. 6Dec. 2004收稿日期 :2004204206作者简介 :陈建平 (1978- , 男 , 硕士研究生 .MAT LAB 与 C/C +、 FORTRAN 语言混合编程陈建平 罗先启(三峡大学 土木水电学院 , 湖北 宜昌 443002摘要 :对 MA TLAB 与 C/C +和 FOR TRAN 语言进行混合编程的常用方法进行了介绍 , 分析了其实现方式和各自的利弊 , 并用实例对 M EX 文件
2、实现方式进行了较详细的论述 .关键词 :MA TLAB ; C/C +; FOR TRAN ; 混合编程 中图分类号 :TP313 文献标识码 :A 文章编号 :16722948X (2004 0620547205Mixed Programming T echnology for MAT FORTRANChen Jianping (College of Civil &Hydropower , Y ichang 443002,China Abstract This paper of mixed programming technology for MA TLAB with C/C +an
3、d FOR TRAN discusses the advantages and disadvantages of these methods. Finally ,it speci 2fies the use of M EX 2by examples.K eyw ords MA TLAB ; C/C +; FOR TRAN ; mixed programming technology1 混合编程的意义及其实现方式1. 1 混合编程的意义MA TLAB 语言具有功能强大 、 开发效率高等诸多优 点 , 已 在 工 程 实 际 中 得 到 广 泛 应 用 , 但 是 与 FOR TRAN 、 C/C
4、 +等语言相比 , 其执行效率较低 , 特别是当程序中含有大量循环语句 (例如迭代计算 时 ,MA TLAB 就有些力不从心 , 速度很慢 , 而运用 FOR TRAN 等擅长数值计算语言进行编程 , 其运行效 率高 . 一方面 , 如果放弃 MA TLAB 强大功能和数量 众多的应用工具箱 , 无疑是资源的极大浪费 . 另一方 面 , 针对工程实际 , 人们用 FOR TRAN 、 C/C +语言 已编写了大量实用程序 , 如果将其重新改写成 M 文 件移植到 MA TLAB 环境中 , 不仅要花费大量的时间 和精力 , 而且有时还降低了其运行效率 . 可否将二者 优势互补呢 ? 混合编程就
5、是其有效的解决途径 . 1. 2 混合编程的实现正是考虑到上面这些原由 ,MA TLAB 系统提供 了其应用程序接口 (Application Program Interface 来解决这些问题 . API 主要包括 3部分 :MEX 文件 外部程序调用接口 , 用来在 MA TLAB 环境下调用 FOR TRAN 、 C/C +语言编写的程序 ; MA T 文件应 用程序 数据输入输出接口 , 用于 MA TLAB 系统 与外 部 环 境 之 间 互 传 数 据 ; 计 算 引 擎 函 数 库 MA TLAB 处于后台作为一个计算引擎 , 与其它应用 程序建立客户机 /服务器关系 , 在其它
6、应用程序中调 用 1,2. 1. 2. 1 M EX 文件M EX 文件是按照一定格式 , 用 FOR TRAN 或 C/C +语言编写的源程序 , 在 MA TLAB 下借助相应 的编译器 , 生成的动态链接函数的统称 . 在 Windows 操作系统下 , 是用 MA TLAB 附带的批处理 mex. bat 来编 译 生 成 文 件 后 缀 名 为 . dll (Dynamic Link Li 2brary 动态链接库文件 , 该文件可在 MA TLAB 环境 下 , 像命令函数一样直接运行和调用 , 使用起来极为 方便 . 采取 M EX 文件方式 , 是重复利用已有 FOR 2TRA
7、N 、 C/C +程序 , 让 MA TLAB 和 FOR TRAN 、 C/C +语言优势互补的最有效和常用的方式 , 但不 足的是其开发的程序只能在 MA TLAB 环境下运行 .本文将详细的论述基于 Windows 平台上其实现过 程 .1. 2. 2 MA T 文件应用程序MA TLAB 数据存储的默认文件名后缀为 . mat , 习惯上称该格式的文件为 MA T 文件 , MA T 文件应 用程序提供了一种方法让 MA TLAB 与其它软件进 行数据输入输出 .1. 2. 3 MA TLAB 计算引擎MA TLAB 引擎采用客户机 /服务器的计算模式 , 通过对 Activex 技术
8、的支持 , 实现 VC 应用程序 (客户 机 与 MA TLAB (服务器 的动态连接通信 . 假如用户 想以较短的时间开发前台为 VC +产生的用户界 面 , 后台由 MA TLAB 计算分析 的 应 用 程 序 , 使 用 MA TLAB 引擎是很好的选择 . 在实际应用中 ,MA T 2 LAB 作为 ActiveX 的自动化服务器 , 接收通过引擎传 来的数据和指令信息并进行相应的处理 ,MA TLAB ,MA TLAB , , 而且应用程序 与 MA TLAB , 整 个算法在 MA TLAB 中执行 , 从而降低了程序的执行 效率 , 因而其实际应用不多 .1. 2. 4 MCC
9、和 MA TCOM前面提到的几种方式都是以 MA TLAB 为主 , 程 序的运行都离不 MA TLAB 环境 . 除此之外 , 另一种 方式就是将 MA TLAB 语言程序翻译成 C/C +语 言代码 , 再用 C/C +语言的方式进行开发 . MA T 2 LAB 自己提供了 C 语言翻译程序 mcc , 另一种是原 第 3方公司 Math Tools 开发的 MA TCOM. 后者出现 较早 , 功能远比 MA TLAB 自己的翻译程序强大 , 所 以 Math Tools 公司已经被 MathWorks 公司收购 , 并 已将其开发技术融于新推出的 MA TLAB 6. 0(Re 2
10、lease 12 中 . 但二者都不完善 , 有大量的 MA TLAB 函数及数据类型是不能兼容变换的 , 所以有时会发现 将简洁的 MA TLAB 程序翻译成 C 语言程序很晦涩 . 翻译后的 C 程序几乎不适合手动去维护 , 更谈不上 升级了 3.2 C/C +语言 MEX 文件的实现C/C +语言 M EX 文件的实现包括 , 源程序的 编辑 、 M EX 编译和调试 . 在编译和调试前要进行编译 器的配置 .2. 1 C/C +语言 MEX 文件的编写C/C +语言 M EX 文件的编写格式 , 除了要遵 循 C/C +语言语法外 , 还须要加入用于 MA TLAB 和 C/C +语言
11、通信协议 入口子程序 . 我们首先 看一个极简单的 C 语言 M EX 文件 , 该程序的作用是 两个数求和 , 源程序如下 :/示例程序 myplus. c :求两个 Double 数之和 #include ” mex. h ”/3计算功能子程序 3/void myplus (double y,double x,double z y0=x0+z0;/3以下是入口子程序 3/void mexFunction (,mxArray 3plhs,intx 3y , 3z ;int mrows0,ncols0;int mrows1,ncols1;/3检查输入输出变量个数 3/if (nrhs ! =2
12、mexErrMsgTxt (” Two inputs arquired ” ;elseif (nlhs >1 mexErrMsgTxt (” Too many output arguments ” ;/3输入量必须是两个非复数 double 类型 3/ mrows0=mx G etM (prhs0 ;ncols0=mx G etN (prhs0 ;if (! mxIsDouble (prhs0 |mxIsComplex (prhs 0 |! (mrows0=1&&ncols0=1 mexErrMsgTxt (” Inputs must be all noncomplex
13、scalar double. ” ;mrows1=mx G etM (prhs1 ;ncols1=mx G etN (prhs1 ;if (! mxIsDouble (prhs1 |mxIsComplex (prhs 1 |! (mrows1=1&&ncols1=1 mexErrMsgTxt (” Inputs must be all noncomplex scalar double. ” ;if (mrows0! =mrows1|ncols0! =ncols1 mexErrMsgTxt (” Inputs must be same dimen 2 sion. ” ;/3为返回
14、参数创建矩阵 3/plhs 0=mxCreateDoubleMatrix (mrows0, ncols0,mxREAL ;x =mx G et Pr (prhs0 ;z =mx G et Pr (prhs1 ;845三 峡 大 学 学 报 (自 然 科 学 版 2004年 12月y =mx G et Pr (plhs0 ;/3调用计算功能子程序 myplus (3/myplus (y ,x ,z ;上面程序为一典型的 C 语言 M EX 文件 , 程序由 两部分构成 :一个计算功能子程序 (myplus (函数 和 一个入口子程序 (mexFunction (函数 . 顾名思义 , 计 算功能
15、子程序包含所有实际所需完成的功能 、 算法 , 我们已有的或现编的 C/C +、 FOR TRAN 程序就被 当做计算功能子程序使用 , 它由入口子程序调用 . 入 口子程序是 MA TLAB 系统和外部程序之间沟通的 桥梁 , 主要用来完成两者之间的通信 . 上面示例程序 中 ,mexFunction (函数有大量语句是用于检查变量 的数据类型等辅助性工作 , 这是必要的 , 因为 MA T 2 LAB 语言不像 C/C +等语言变量使用前须声明 , 对类型的检查可以避免许多错误的发生 .MA 2 LAB API 函数 , . mexFunction (, : void mexFunctio
16、n (,mxArray 3plhs,int nrhs ,const mxArray 3prhs /一些必要的代码 , 用来完成 MA TLAB 系 统与计算功能子程序之间的通信其参数的含意为 :nrhs和 nlhs , 整型变量 , 分别为 调用 M EX 文件时输入 、 输出参数的个数 . prhs 、 plhs , 指针数组 , 其元素分别为指向输入 、 输出参数的指针 . mexErrMsg Txt (, 用于输出错误信息 , 并返回到 MA TLAB 命令提示符下 .mx G etM (和 mx G etN ( , 获得矩阵的行数和列 数 , 参数为指向矩阵的指针 , 如程序中的 mr
17、ows0= mx G etM (prhs0 的作用为 :得到第一个输入实参的 行数 , 并赋值给整型变量 mrows0.mxIsDouble (、 mxIsComplex (, 判断矩阵是否为 双精度型 、 复数型 . 输入参数为矩阵指针 , 返回值为 BOOL 值 .mxCreateDoubleMatrix (int m ,int n ,mxComplex 2 ity complexFlag , 创建一个未赋值的双精度矩阵 ,m , n 为创建矩阵的行 、 列数 ,complexFlag 为标识是实数 还是复数 . 该函数返回所创建矩阵的指针 .mx G et Pr (获得矩阵实数部分的指针
18、 , 输入参数 为矩阵的指针 , 返回值为矩阵实数部分的双精度指 针 .MA TLAB API 函数还包含其它许多接口函数 , 分为 mx 2函数和 mex 2函数 , 详细情况可查阅相关文 献 .M EX 源程序编写完成后 , 还要经过编译后才能 生成 dll 文件 , 供 MA TLAB 或其它程序调用 , 编译前 要对 MA TLAB 进行编译器的配置 .2. 2 编译器的配置编译 器 的 配 置 是 通 过 MA TLAB 的 配 置 文 件 (mexopts. bat 进行的 , 其具体过程为 :在 MA TLAB 命令窗口下键入 :mex2steup , 随后系统弹出一个 DOS
19、窗口 , 按照提示一步步选择完成即可 . 该命令可带许 多参数 , 可针对不同的操作系统进行多种配置 2,3. 2. 3 C/C +语言 MEX 文件的编译编译方法很简单 , TLAB 命令提示符 , 为需编译的源程 , , 修改源程序 、 调 . 编译通过生成的可执行 , 可在 MA TLAB 命令提示符下或其它程 序中调用 .3 FORTRAN 语言 MEX 文件的实现FOR TRAN 语言 M EX 文件的实现步骤和 C/C +语言 M EX 文件大体相同 .3. 1 FOR TRAN 语言 M EX 文件的编写MA TLAB 提供了 C/C +和 FOR TRAN 两种 语言的接口 ,
20、 基于 FOR TRAN 语言和前面讲到的基 于 C/C +语言的 M EX 文件在实现方式上相差不 大 . 我们先还是看一下前面程序用 FOR TRAN 语言 M EX 文件来实现的源程序 .! 示例程序 myplus. f :求两个数之和! 计算功能子程序subroutine myplus (y ,x ,z ! 变量声明real 38x ,y ,zy =x +zreturnend! 以下是入口子程序subroutine mexFunction (nlhs ,plhs ,nrhs ,prhs ! 参数声明integer nlhs ,nrhs ,plhs (3 ,prhs (3! 调用 API
21、 库函数的声明integer mx G et Pr ,mxCreateFullinteger mx G etM ,mx G etN ,mxIsNumeric! 程序内部使用变量的声明945第 26卷 第 6期 陈建平等 MA TLAB 与 C/C +、 FORTRAN 语言混合编程integer xpr ,ypr ,zprinteger mrows ,ncols ,sizereal 38x ,y ,z! 检查输入输出变量个数if (nrhs. ne. 2 thencall mexErrMsg Txt ( Two inputs arquired elseif (nlhs. gt. 1 thenc
22、all mexErrMsg Txt ( Too many output argu 2 ments endif! 输入量必须是两个数mrows =mx G etM (prhs (1 ncols =mx G etN (prhs (1 size =mrows 3ncolsif (mxIsNumeric (prhs (1 . eq. 0 thencall mexErrMsg Txt ( Inputs must be a number endifmrows =mx Gncols =mx G etN size =mrows 3if (mxIsNumeric (prhs (2 . eq. 0 thencal
23、l mexErrMsg Txt ( Inputs must be a number endif! 为输出参数创建矩阵plhs (1 =mxCreateFull (mrows ,ncols ,0xpr =mx G et Pr (prhs (1 zpr =mx G et Pr (prhs (2 ypr =mx G et Pr (plhs (1 ! 将数据指针转换成双精度型call mxCopyPtr ToReal8(xpr ,x ,size call mxCopyPtr ToReal8(zpr ,z ,size ! 调用计算功能子程序 mypluscall myplus (y ,x ,z ! 将计
24、算结果传给输出数据指针call mxCopyReal8To Ptr (y ,ypr ,size returnend该程序的结构和内容与前面 myplus. c 大致相 同 , 也是由两部分 :一个计算功能子例行程序和一个 入口子例行程序构成 , 其程序中参数和变量大多相 同 , 这里就不一一再介绍了 . 但值得一提的是 , FOR 2 TRAN 和 C/C +语言语法规则相差较大 , 在 C/C + +语言中对字符大小写是敏感的 , 而 FOR TRAN 语 言中大小写是一样的 ;C/C +语言中数组是按行存 储 , 数组下标是从 0开始计数的 , 而 FOR TRAN 语言 中数组是按列存储
25、 , 数组下标从 1开始 . C/C +语 言几乎支持所有的数据类型 , 支持头文件 , 操作很灵 活 . 而 FOR TRAN 语言 , 不支持指针 , 参数传输较麻 烦 1.3. 2 FORTRAN 语言 MEX 文件的编译和 C/C +语言 M EX 文件一样 , 编译前需进行 编译器的配置 , 方法同前 , 只是选的编译器不同 (例如 Compaq Visual Fortran version 6. 6 . 编译的过程也一 样 ,MA TLAB6的编译命令 (不再区分 C/C +文件 用 cmex. bat ,FOR TRAN 用 fmex. bat 统一使用 mex. bat 批处理
26、命令 , 其后的文件名须带扩展名 .4 MEX 文件的建Studio 的配置前面使用的 mex 文件的使用方式 , 类似在 DOS 下程序开发方式 , 程序编辑 、 编译 、 调试和执行分开 , 每次只能创建一个文件 , 需要来回切换 MA TLAB 命 令窗口和编辑窗口 , 操作较麻烦 . VC 是在 Windows 环境下的优秀开发平台 , 将 MA TLAB 和 VC 强强联 手 , 无疑是非常好的混合编程方式 . 下面就简要介绍 一下如何在 VC 的 IDE (Integrated Development Envi 2 ronment 中编译 M EX 程序 . 为了表述的方便 , 我
27、们以 MA TLAB6. 5(安装在 C :matlab6p5 和 Visual C + +6. 0(安装在 D :Program Files Microsoft Visual Studio 为例 , 可以分为以下 5步 4,5: 用 VC 创建一个工程 (假定名称为 myproject , 类型选择 Win32Dynamic -link Library , 并将自己的 M EX 源程序和 mexversion. rc (在 C :MA TLAB6p5 extern include 下 加入到工程 . 创建一个与工程同名的定义文件 (myproject. def , 内容如下 :L IBRAR
28、 Y myproject. dllEXPOR TS mexFunction(如 果 是 FOR TRAN 该 行 改 为 EXPOR TS -M EXFUNCTION 16并加入定义文件 myproject. def 到工程 定位库文件 (. lib 位置 . 具体操作为 :选择 VC 下拉菜单 Tools/Options , 在弹出的对话框 Show di 2 rectories for 下拉框中选择 Library files , 在下部的 Di 2 rectories:中添加 C :MA TLAB6p5extern lib win32microsoft msvc60目录 . 然后选择 V
29、C 下拉 菜单 Project/Settings , 在 弹 出 的 对 话 框 中 选 择055三 峡 大 学 学 报 (自 然 科 学 版 2004年 12月Link 选项卡 , 在 Category 栏中选择 general 选项 , 在 出现的 Object/library modules :框中填入 libmx. lib , libmex. lib , and libmat. lib. 加入 MA TLAB include 目录 . 具体操作为 :选 择 VC 下拉菜单 Tools/Options , 在弹出的对话框 Show directories for 下拉框中选择 Include files , 在下 部的 Directories :中添加 C :MA TLAB6p5extern include 目录 . 然后选择 VC 下拉菜单 Project/Set 2 tings , 在弹出的对话框中选择 C/C +选项卡 , 在 Category 栏中选择 Preprocessor 选项 , 在出现的 Pre 2 processor definitions :框 中 填 入 MA TLAB-M EX -FIL E. 最后就是调试运行配置 . 具体操作为 :选择 VC 下拉菜单 Project/Settings , 在弹出的对话框选择
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二四年度综合布线系统设计与实施合同2篇
- 2024年度工程建设项目居间合同
- 简易酒类购销的合同范本
- 2024版居间协议:工程分包简单约定2篇
- 《精美壁纸》课件2
- 经营权承包的合同范本
- 《康复评定山医》课件
- 《社保公积金讲解》课件
- 小型犬产前护理
- 2024年度工厂食堂厨房设备采购与安装合同2篇
- 材料自动分拣控制系统的设计
- 十二指肠溃疡伴穿孔的护理查房
- 盘扣式外架施工方案及流程
- 混合机大数据分析与预测性维护
- 东营港加油、LNG加气站工程环评报告表
- 数字化影视制作流程策划书
- 《物联网单片机应用与开发》课程标准(含课程思政)
- 电源适配器方案
- 人民银行征信报告样板
- 全国民用建筑工程设计技术措施节能专篇-暖通空调动力
- 中国急诊重症肺炎临床实践专家共识课件
评论
0/150
提交评论