MATLAB 与C C + + 、FORTRAN语言混合编程

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 ,

相关文档
最新文档