MATLAB 与C C + + 、FORTRAN语言混合编程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MATLAB 与C/ C + + 、FORTRAN语言混合编程摘要:对MATLAB 与C/ C + + 和FORTRAN 语言进行混合编程的常用方法进行了介绍,分析了其实现方式和各自的利弊,并用实例对MEX 文件实现方式进行了较详细的论述.
关键词: MATLAB ; C/ C + + ; FORTRAN ; 混合编程
中图分类号: TP313 文献标识码: A 文章编号:16722948X(2004) 0620547205 1 混合编程的意义及其实现方式
1. 1 混合编程的意义
MATLAB 语言具有功能强大、开发效率高等诸
多优点, 已在工程实际中得到广泛应用, 但是与
FORTRAN、C/ C + + 等语言相比,其执行效率较低,
特别是当程序中含有大量循环语句(例如迭代计算)
时,MATLAB 就有些力不从心, 速度很慢, 而运用
FORTRAN 等擅长数值计算语言进行编程,其运行效
率高. 一方面,如果放弃MATLAB 强大功能和数量
众多的应用工具箱,无疑是资源的极大浪费. 另一方
面,针对工程实际,人们用FORTRAN、C/ C + + 语言
已编写了大量实用程序,如果将其重新改写成M 文
件移植到MATLAB 环境中,不仅要花费大量的时间
和精力,而且有时还降低了其运行效率. 可否将二者
优势互补呢? 混合编程就是其有效的解决途径.
1. 2 混合编程的实现
正是考虑到上面这些原由,MATLAB 系统提供
了其应用程序接口(Application Program Interface) 来
解决这些问题. API 主要包括3 部分:MEX 文件———
外部程序调用接口,用来在MATLAB 环境下调用
FORTRAN、C/ C + + 语言编写的程序;MAT 文件应
用程序———数据输入输出接口,用于MATLAB 系统
与外部环境之间互传数据; 计算引擎函数库———
MATLAB 处于后台作为一个计算引擎,与其它应用
程序建立客户机/ 服务器关系,在其它应用程序中调
用[1 ,2 ] .
1. 2. 1 MEX 文件
MEX 文件是按照一定格式,用FORTRAN 或C/
C + + 语言编写的源程序,在MATLAB 下借助相应
的编译器,生成的动态链接函数的统称. 在Windows
操作系统下,是用MATLAB 附带的批处理mex. bat
来编译生成文件后缀名为. dll (Dynamic Link Li2
brary) 动态链接库文件,该文件可在MATLAB 环境
下,像命令函数一样直接运行和调用,使用起来极为
方便. 采取MEX 文件方式,是重复利用已有FOR2
TRAN、C/ C + + 程序,让MATLAB 和FORTRAN、
C/ C + + 语言优势互补的最有效和常用的方式,但不足的是其开发的程序只能在MATLAB 环境下运行.
本文将详细的论述基于Windows 平台上其实现过
程.
1. 2. 2 MAT 文件应用程序
MATLAB 数据存储的默认文件名后缀为. mat ,
习惯上称该格式的文件为MAT 文件, MAT 文件应
用程序提供了一种方法让MATLAB 与其它软件进
行数据输入输出.
1. 2. 3 MATLAB 计算引擎
MATLAB 引擎采用客户机/ 服务器的计算模式,
通过对Activex 技术的支持,实现VC 应用程序(客户机) 与MATLAB(服务器) 的动态连接通信. 假如用户想以较短的时间开发前台为VC + + 产生的用户界面,后台由MATLAB 计算分析的应用程序, 使用MATLAB 引擎是很好的选择. 在实际应用中,MAT2 LAB 作为ActiveX 的自动化服务器,接收通过引擎传来的数据和指令信息并进行相应的处理,然后将结果经过引擎返回给发送请求的客户机. 但这种方式需要MATLAB 在后台的适时运行, 如果用户没有安装MATLAB ,应用程序就无法正常运行,而且应用程序
与MATLAB 间通过字符流传递数据和命令参数,整
个算法在MATLAB 中执行,从而降低了程序的执行
效率,因而其实际应用不多.
1. 2. 4 MCC 和MATCOM
前面提到的几种方式都是以MATLAB 为主,程
序的运行都离不MATLAB 环境. 除此之外,另一种
方式就是将MATLAB 语言程序翻译成C/ C + + 语
言代码,再用C/ C + + 语言的方式进行开发. MAT2 LAB 自己提供了C 语言翻译程序mcc , 另一种是原
第3 方公司MathTools 开发的MATCOM. 后者出现
较早,功能远比MATLAB 自己的翻译程序强大,所
以MathTools 公司已经被MathWorks 公司收购,并
已将其开发技术融于新推出的MATLAB 6. 0 (Re2 lease 12) 中. 但二者都不完善,有大量的MATLAB
函数及数据类型是不能兼容变换的,所以有时会发现将简洁的MATLAB 程序翻译成C 语言程序很晦涩.
翻译后的C 程序几乎不适合手动去维护,更谈不上
升级了[3 ] .
2 C/ C + + 语言MEX文件的实现
C/ C + + 语言MEX 文件的实现包括,源程序的
编辑、MEX 编译和调试. 在编译和调试前要进行编译器的配置.
2. 1 C/ C+ + 语言MEX文件的编写
C/ C + + 语言MEX 文件的编写格式,除了要遵
循C/ C + + 语言语法外,还须要加入用于MATLAB
和C/ C + + 语言通信协议———入口子程序. 我们首先看一个极简单的C 语言MEX 文件,该程序的作用是
两个数求和,源程序如下:
/ / 示例程序myplus. c :求两个Double 数之和
# include ”mex. h”
/ 3 计算功能子程序3 /
void myplus (double y[ ] ,double x[ ] ,double z[ ]) {
y[0 ] = x[0 ] + z[0 ] ;
}
/ 3 以下是入口子程序3 /
void mexFunction(int nlhs ,mxArray 3 plhs[ ] ,int nrhs ,const mxArray 3 prhs[ ])
{
double 3 x , 3 y , 3 z ;
int mrows0 ,ncols0 ;
int mrows1 ,ncols1 ;
/ 3 检查输入输出变量个数3 /
if (nrhs ! = 2)
mexErrMsgTxt (”Two input s arquired”) ;
else
if ( nlhs > 1) mexErrMsgTxt ( ”Too many output argument s”) ;
/ 3 输入量必须是两个非复数double 类型3 /
mrows0 = mxGetM(prhs[0 ]) ;
ncols0 = mxGetN(prhs[0 ]) ;
if ( ! mxIsDouble (prhs [ 0 ]) | | mxIsComplex (prhs [0 ]) | | ! (mrows0 = = 1 & &ncols0 = = 1) ) mexErrMsgTxt ( ”Input s must be all noncomplex scalar double. ”) ;
mrows1 = mxGetM(prhs[1 ]) ;
ncols1 = mxGetN(prhs[1 ]) ;
if ( ! mxIsDouble (prhs [ 1 ]) | | mxIsComplex (prhs [1 ]) | | ! (mrows1 = = 1 & &ncols1 = = 1) ) mexErrMsgTxt ( ”Input s must be all noncomplex scalar double. ”) ;
if (mrows0 ! = mrows1| | ncols0 ! = ncols1) mexErrMsgTxt ( ”Input s must be same dimen2
sion. ”) ;
/ 3 为返回参数创建矩阵3 /
plhs [ 0 ] = mxCreateDoubleMat rix ( mrows0 ,