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

更新时间:2023-05-26 02:17:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

!!"#$"%与&&’’"()*#*"+语言混合编程

陈建平!罗先启

!三峡大学土木水电学院"湖北宜昌!###,""!

摘要!对-./"分析了0.1与2233和456/6.7语言进行混合编程的常用方法进行了介绍#

其实现方式和各自的利弊#并用实例对-89文件实现方式进行了较详细的论述+关键词!-./"0.1$233$56/6.7$!2!4!混合编程

中图分类号##/:,&,!!!文献标识码#.!!!文章编号#&%(!$’#)9"!""#"%$";#($";

%!,-./0121455,6.78629221!"#$"%<,=8&&’’46/()*#*"+33#3:;

2<=>?@A>@>DE9@A>@!0BCF

"$$#2EGG==EH2@I@GJKMNEEO=N8>@>==N@>2<@>A/<N==PEN=QR>@I+S@T<A>#,""!$2<@>ACLBCCCC#">?=147=<@QBA=N@>UNEMDT=QU<=TEVVE>V=U<EMEHV@W=MBNENAVV@>=T<>EGEEN-./0.1O@U<!/BCCUCLH%2233A>M456/6.7$A>MA>AGX=QA>MM@QTDQQ=QU<=AMIA>UA=QA>MM@QAMIA>UA=QEHU<=Q=V=U<EMQ+4@$LCC$>AGG@UQ=T@H@=QU<=DQ=EH-89$H@G=YWAVG=Q+LBL=B

%@.<21/?0.1&233&56/6.7&@W=MBNENAVV@>=T<>EGE!2!4!V!-./CCUCL:

了其应用程序接口"#.G@TAU@E>:NENAVZ>U=NHAT=BBC

来解决这些问题+.:Z主要包括,部分!-89文件(((外部程序调用接口$用来在-./0.1环境下调用4%56/6.7’2233语言编写的程序&-./文件应用程序(((数据输入输出接口$用于-./0.1系统与外部环境之间互传数据&计算引擎函数库(((与其它应用-./0.1处于后台作为一个计算引擎$程序建立客户机%服务器关系$在其它应用程序中调

&$!*用)+

A!混合编程的意义及其实现方式

A+A!混合编程的意义

开发效率高等诸-./0.1语言具有功能强大’多优点$已在工程实际中得到广泛应用$但是与%其执行效率较低$456/6.7’2233等语言相比$

特别是当程序中含有大量循环语句"例如迭代计算#时$速度很慢$而运用-./0.1就有些力不从心$其运行456/6.7等擅长数值计算语言进行编程$效率高+一方面$如果放弃-./0.1强大功能和数量众多的应用工具箱$无疑是资源的极大浪费+另一方面$针对工程实际$人们用4%56/6.7’2233语言已编写了大量实用程序$如果将其重新改写成-文件移植到-./不仅要花费大量的时0.1环境中$间和精力$而且有时还降低了其运行效率+可否将二者优势互补呢?混合编程就是其有效的解决途径+A+B!混合编程的实现

正是考虑到上面这些原由$-./0.1系统提供

收稿日期!!""#$"#$"%

作者简介!陈建平"$男$硕士研究生+&’()*#万方数据

&+!+&!-89文件

用4-89文件是按照一定格式$56/6.7或

%在-./2233语言编写的源程序$0.1下借助相应的编译器$生成的动态链接函数的统称+在[@>$

是用-./MEOQ操作系统下$0.1附带的批处理V=W+YAU来编译生成文件后缀名为+MGG"\>AV@TL动态链接库文件$该文件可在-./0@>]0@YNAN$L#

像命令函数一样直接运行和调用$使用0.1环境下$起来极为方便+采取-8是重复利用已9文件方式$

有4%让-./56/6.7’2233程序$0.1和456

$

;#)

三峡大学学报$自然科学版%""#年&!月!!!!!!!!!!!!!!

"/6.7!2233语言优势互补的最有效和常用的方但不足的是其开发的程序只能在-./式#0.1环境下运行+本文将详细的论述基于[@>MEOQ平台上其实现过程+

&+!+!!-./文件应用程序

#-./0.1数据存储的默认文件名后缀为+VAU习惯上称该格式的文件为-./文件#-./文件应

用程序提供了一种方法让-./0.1与其它软件进行数据输入输出+

&+!+,!-./0.1计算引擎

!BEA!&&’’语言!CD文件的编写

"除了要遵2233语言-89文件的编写格式#循2"还须要加入用于-./233语言语法外#0.1和2"((入口子程序+我们首先233语言通信协议(看一个极简单的2语言-8该程序的作用是9文件#

源程序如下)两个数求和#

""示例程序V)求两个\GDQ+TEDYG=数之和LB@>TGDM=_V=W+<_!

""计算功能子程序""

’#’#IE@MVGDQ$MEDYG=L&MEDYG=W&MEDYG=XLB

-./0.1引擎采用客户机"服务器的计算模式#通过对.TU@I=W技术的支持#实现^2应用程序$客户机%与-./0.1$服务器%的动态连接通信+假如用户想以较短的时间开发前台为^233产生的用户界面#后台由-./0.1计算分析的应用程序#使用-./0.1引擎是很好的选择+

在实际应用中#-./0.1作为.TU@I=9的自动化服务器#接收通过引擎传来的数据和指令信息并进行相应的处理#然后将结果经过引擎返回给发送请求的客户机+但这种方式需要-./0.1在后台的适时运行#

如果用户没有安装-./0.1#应用程序就无法正常运行#而且应用程序与-./0.1间通过字符流传递数据和命令参数#整个算法在-./0.1中执行#从而降低了程序的执行效率#

因而其实际应用不多++!+#!-22和-./25-前面提到的几种方式都是以-./0.1为主#程序的运行都离不-./0.1环境+除此之外#另一种方式就是将-./0.1语言程序翻译成2"233语言代码#再用2"233语言的方式进行开发+-./$.1自己提供了2语言翻译程序VTT#另一种是原第,方公司-AU</EEGQ开发的-./25-+后者出现较早#功能远比-./0.1自己的翻译程序强大#

所以-AU</EEGQ公司已经被-AU<[EN]Q公司收购#并已将其开发技术融于新推出的-./0.1%+"

$6=G=AQ=&!%中+但二者都不完善#有大量的-./$.1函数及数据类型是不能兼容变换的#所以有时会发现将简洁的-./0.1程序翻译成2语言程序很晦涩+翻译后的2程序几乎不适合手动去维护#更谈不上升级了

&,’

+

!&!&’’语言!CD文件的实现

2"233语言-89文件的实现包括#

源程序的编辑!-89编译和调试+在编译和调试前要进行编译器的配置万方数据+

&’%

*

L

&"’‘W&"’3X&"’+,

""以下是入口子程序""

IE@MV=W4D>TU@E>$@>U>G<Q#VW.NNAL"BG<Q&’#>U>N<Q#TE>QUVW.NNAL"B

N<Q&’%*

MEDYG="W#"L#"

X+@>UVNEOQ"#>TEGQ"+@>UVNEOQ&#>TEGQ&+

""检查输入输出变量个数""@H$>N<Q

!‘!%V=W8NN-QC/WU$_/OE@>BDUQANFD@N=M_%+=GQ=@H$>G<Q#&%V=W8NN-QC/WU$_/EEVA>LEDUB

DUNC

DV=>UQ_%+""输入量必须是两个非复数MEDYG=类型""

VNEOQ"‘VWP=U-$B

N<Q&"’%+>TEGQ"‘VWP=U7$B

N<Q&"’%+@H$!VWZQ\EDYG=$BN<Q&"’%$$VWZQ2EVB

G=W$B

N<Q&"’%$$!$VNEOQ"‘‘&JJ>TEGQ"‘‘&%%V=W8NN-QC/WU$_Z>BDUQVDQUY=AGG>E>TEV$G=WQTAGANMEDYG=+_%+VNEOQ&‘VWP=U-$B

N<Q&&’%+>TEGQ&‘VWP=U7$B

N<Q&&’%+@H$!VWZQ\EDYG=$BN<Q&&’%$$VWZQ2EVBG=W$B

N<Q&&’%$$!$VNEOQ&‘‘&JJ>TEGQ&‘‘&%%V=W8NN-QC/WU$_Z>BDUQVDQUY=AGG>E>TEV$G=WQTAGANMEDYG=+_%+@H$VNEOQ"!‘VNEOQ&$$>TEGQ"!‘>TEGQ&%V=W8NN-QC/WU$_Z>BDUQVDQUY=QAV=M@V=>$@E>+_

%+""为返回参数创建矩阵""

B

G<Q&"’‘VW2N=AU=\EDYG=-AUN@W$VNEOQ"#&00@AB

B

QB

第!’%卷!第%期!!!!!!!!!!陈建平等!-./0.1与2233*456/6.7语言混合编程

;#’

#>TEGQ"!VW68.0"

$%&"#W‘VWP=U:N"N<QB

$%&"#X‘VWP=U:NN<Q&B$%&"#‘VWP=U:NG<Q"LB

’"调用计算功能子程序V$"GDQ"’LB$!"#VGDQW!XLBL(

上面程序为一典型的2语言-8程序由9文件!

两部分构成)一个计算功能子程序$$"函数"和VGDQLB一个入口子程序$$"函数"顾名思义!计V=W4D>TU@E>+$"获得矩阵实数部分的指针!输入参数VWP=U:N

返回值为矩阵实数部分的双精度指为矩阵的指针!针+

-./0.1.:Z函数还包含其它许多接口函数!

分为V函数和V函数!详细情况可查阅相关文W$=W$献+

还要经过编译后才能-89源程序编写完成后!生成M供-./编译前GG文件!0.1或其它程序调用!要对-./0.1进行编译器的配置+B+B!编译器的配置

算功能子程序包含所有实际所需完成的功能*算法!我们已有的或现编的2’233*456/6.7程序就被当做计算功能子程序使用!它由入口子程序调用+入口子程序是-./0.1系统和外部程序之间沟通的桥梁!主要用来完成两者之间的通信+上面示例程序中!V=W4D>TU@E>$"函数有大量语句是用于检查变量的数据类型等辅助性工作!这是必要的!因为-./0.1语言不像2’233等语言变量使用前须声明!对类型的检查可以避免许多错误的发生+下面简要的说明一下上面程序中用到的-./$

.1.:Z函数!它们在V=W+<或VAUN@W+<中声明+V=W4D>TU@E>$"!入口子程序函数!其格式如下)IE@MV=W4D>TU@E>$@>U>G<Q!VW.NNAL"BG<Q%&!>U>N<Q!TE>QUVW.NNAL"BN<Q%&"+,,’’一些必要的代码!用来完成-./0.1系统与计算功能子程序之间的通信

(

其参数的含意为)>N<Q和>G<Q!整型变量!分别为调用-89文件时输入*输出参数的个数+BN<Q*G<Q!指针数组!其元素分别为指向输入*输出参数的指针+

V=W8NN-QC/WU$"!用于输出错误信息!并返回到-./0.1命令提示符下+VWP=U-$"和VWP=U7$"!获得矩阵的行数和列数!参数为指向矩阵的指针!如程序中的VNEOQ"‘

VWP=U-$BN<Q%"&"的作用为)得到第一个输入实参的行数!并赋值给整型变量VNEOQ"+

VWZQ\EDYG=$"*VWZQ2EVB

G=W$"!判断矩阵是否为双精度型*复数型+输入参数为矩阵指针!返回值为550值+

VW2N=AU=\EDYG=-AUN@W$

@>UV!@>U>!VW2EV$G=W@ULTEVBG=W4GAC"

!创建一个未赋值的双精度矩阵!V!>为创建矩阵的行*列数!TEVBG=W4GAC为标识

是实数还是复数万方数据+

该函数返回所创建矩阵的指针+编译器的配置是通过-./0.1的配置文件$V=WEB

UQ+YAU"进行的!其具体过程为)在-./0.1命令窗口下键入)V=W$QU=DB!随后系统弹出一个\5a窗口!按照提示一步步选择完成即可+该命令可带许多参数!可针对不同的操作系统进行多种配

置%!!,&+

BEF!&!&’’语言!CD文件的编译

编译方法很简单!直接在-./0.1命令提示符下键入)V=WH@G=>AV=!其中H@G=>AV=为需编译的源程序名+

如果提示有错误信息!需查错!修改源程序*调试+直到没有错误信息提示+编译通过生成的可执行的MGG文件!可在-./0.1命令提示符下或其它程序中调用+

F!()*#*"+语言!CD文件的实现

456/6.7语言-89文件的实现步骤和2’233语言-89文件大体相同+F+A!456/6.7语言-89文件的编写

-./0.1提供了2’233和456/6.7两种语言的接口!基于456/6.7语言和前面讲到的基于2’233语言的-89文件在实现方式上相差不

大+我们先还是看一下前面程序用456/6.7语言-89文件来实现的源程序+

!示例程序VLB

GDQ+H)求两个数之和!计算功能子程序

QDYNEDU@>=VLBGDQ$L!W!X"!变量声明N=AG")W!L!XL‘W3XN=UDN>

=>M

!以下是入口子程序

QDYNEDU@>=V=W4D>TU@E>$>G<Q!BG<Q!>N<Q!B

N<Q"!参数声明

0@B1B

;;"

三峡大学学报"自然科学版#""#年&!月!!!!!!!!!!!!!!

!!"!"@>U==N>G<Q>N<QG<QN<Q"#"#CBB

!调用.:Z库函数的声明!@>U==NVWP=U:NVW2N=AU=4DGGC@>U==NVWP=U-!VWP=U7!VWZQ7DV=N@TC!程序内部使用变量的声明!!@>U==NWNXNNCBBLB

!!@>U==NVNEOQ>TEGQQ@X=C!N=AGX")W!L

!检查输入输出变量个数"#@H>N<Q+>=+!U<=>

同!这里就不一一再介绍了+但值得一提的是!456$%在2%/6.7和2233语言语法规则相差较大!2

而433语言中对字符大小写是敏感的!56/6.7语言中大小写是一样的&%2233语言中数组是按行存储!数组下标是从"开始计数的!而456/6.7语言中数组是按列存储!数组下标从&开始+%2233语言几乎支持所有的数据类型!支持头文件!操作很灵活+而4不支持指针!参数传输较56/6.7语言!

&(

麻烦’+

FEB!()*#*"+语言!CD文件的编译

TAGGV=W8NN-QC/WU"b/OE@>BDUQANF

D@N=Mb#=GQ=@H">G<Q+CU+&#U<=>TAGGV=W8NN-QC/WU"b/EEVA>LEDUBDUANCD$=>UQb

#=>M@H

!输入量必须是两个数VNEOQ‘VWP=U-"BN<Q"&##>TEGQ‘VWP=U7"B

N<Q"&##Q@X=‘VNEOQ">

TEGQ@H"VWZQ7DV=N@T"BN<Q"&##+=F

+"#U<=>TAGGV=W8NN-QC/WU"bZ>BDUQVDQUY=A>DVY=Nb#=>M@H

VNEOQ‘VWP=U-"B

N<Q"!##>TEGQ‘VWP=U7"B

N<Q"!##Q@X=‘VNEOQ">

TEGQ@H"VWZQ7DV=N@T"BN<Q"!##+=F

+"#U<=>TAGGV=W8NN-QC/WU"bZ>BDUQVDQUY=A>DVY=Nb#=>M@H

!为输出参数创建矩阵

B

G<Q"&#‘VW2N=AU=4DGG"VNEOQ!>TEGQ!"#WBN‘VWP=U:N"BN<Q"&##XBN‘VWP=U:N"BN<Q"!##LBN‘VWP=U:N"BG<Q"&##!将数据指针转换成双精度型TAGGVW2EBL:UN/E6=AG)"WB

N!W!Q@X=#TAGGVW2EBL:UN/E6=AG)"XBN!X!Q@X=#!调用计算功能子程序VLB

GDQTAGGVLBGDQ"L!W!X#!将计算结果传给输出数据指针TAGGVW2EBL6=AG)/E:UN"L!LBN!Q@X=#N=UDN>

=>M

该程序的结构和内容与前面VLBGDQ+T大致相同!也是由两部分$一个计算功能子例行程序和一个

入口子例行万方数据程序构成!其程序中参数和变量大多相

和2%233语言-89文件一样!编译前需进行编译器的配置!方法同前!只是选的编译器不同"例如EVBAF^@QDAG4ENUNA>I=NQ@E>%+%#+编译的过程也一样!-./0.1%的编译命令"不再区分2%233文件用TV=W+YAU!456/6.7用HV=W+YAU#统一使用V=W+YAU批处理命令!

其后的文件名须带扩展名+!H,?I49J=I/,2KLC下!CD文件的建立和调试

EA!H,?I49J=I/,2的配置

前面使用的V=W文件的使用方式!类似在\5a下程序开发方式!程序编辑)编译)调试和执行分开!每次只能创建一个文件!需要来回切换-./0.1命

令窗口和编辑窗口!操作较麻烦+^2是在[@>MEOQ环境下的优秀开发平台!将-./0.1和^2强强联

手!无疑是非常好的混合编程方式+下面就简要介绍一下如何在^2的Z\8"Z>U=CNAU=M\=I=GEBV=>U8>$@NE>V=>U#中编译-89程序+为了表述的方便!我们以-./0.1%+;"安装在2$%VAUGAY%B;#和^@QDAG233%+""安装在\$%:NEC

NAV4@G=Q%-@TNEQEHU^@QDAGUDM@E

#为例!可以分为以下;步’#!;(

$"用^

2创建一个工程"假定名称为VLBNEc=TU#!类型选择[@>,!\L

>AV@T*G@>]0@YNAN$!并将自己的-89源程序和V=WI=NQ@E>+NT"在2$%-./0.1%B

;%=WU=N>%@>TGDM=下#加入到工程+#创建一个与工程同名的定义文件"VLBNEc=TU+=H

#!内容如下$0Z16.6SVLBNEc

=TU+MGG89:56/aV=W4D>TU@E>

"如果是456/6.7该行改为89:56/a_-894R72/Z57$&%#

并加入定义文件VLBNEc

=TU+M=H到工程%定位库文件"

+G@Y#位置+具体操作为$选择^2V2GGIaL

M

第!!%卷!第%期!!!!!!!!!!陈建平等!-./0.1与2233%456/6.7

语言混合编程

;;&

下拉菜单/!在弹出的对话框aEEGQ5U@E>Q"#<EOB

#在下部的M@N=TUEN@=QHEN下拉框中选择0@YNAN@G=QLH$中添加2$\@N=TUEN@=Q0.1%;=WU=N>G@Y%-./%%%B

然后选择^O@>,!V@TNEQEHUVQIT%"目录+2下拉菜%%单:!"#在弹出的对话框中选择0NE=TUa=UU@>Q@>]cC选项卡#在2在出现AU=EN=>=NAG选项#CL栏中选择C的5!$框中填入GY=TUG@YNANEMDG=Q@YVW+G@Y#G@Y$cLVV=W+G@Y#A>MG@YVAU+G@Y+

具体操作为$选0.1@>TGDM=目录+&加入-./择^!在弹出的对话框2下拉菜单/EEGQ5U@E>Q"#B

"#在弹出的对话框中勾选-./2DQUEV@X=0.1AMM

随后^*@>复选框+2就出现了如图&所示的工具条#其中第一个按钮的功能就是用来将-*H@G=Q添

加到^@QDAGaUDM@EZ\8中的+

图&!图标示例

N结语

<EOM@N=TUEN@=QHEN下拉框中选择Z>TGDM=H@G=Q#在下部的\@N=TUEN@=Q$中添加2$%-./0.1%B;%=WU=N>@>TGDM=目录+然后选择^2下拉菜单:NEc

=TU!a=U$@>CQ"#在弹出的对话框中选择2!233选项卡#在AU=CENL栏中选择:N=B

NET=QQEN选项#在出现的:N=$NET=QQENM=H@>@U@E>Q$框中填入-./0.1_-89_Z08+

’最后就是调试运行配置+具体操作为$选择2下拉菜单:NEc=TU!a=UU@>C

Q"#在弹出的对话框选择\=YDC选项卡#在2AU=CENL栏中选择P=>=NAG选项#在出现的8W=TDUAYG=HENM=YDCQ=QQ@E>$框中填入$%-./0.1%B;%Y@>%O@>,!%VAUGAY+=W=+EB!在H,?I49J=I/,2中使用!"#$"%4//M,6-./0.1%+9为^@QDAGaUDM@EZ\8提供了AMM

*@>#该AMM*@>使-./0.1的-*H@G=Q非常容易的就可加入到^2环境中#使^2和-./0.1很好的融合+不过要使用该插件需要简单的配置+具体操作如下$

使用前面提到的V=W*QU=DB命令进行编译器的配置#选择^2作为编译器后#

该命令自动装载-./0.1AMM*@>+然后选择^2下拉菜单/EEGQ

!万方数据

!!本文对-./0.1与2!233和456/6.7语言进行混合编程的常用#种方法进行了论述+#种方法各有其优势#又各有不足+其中-89文件的方式#特别是^@QDAGaUDM@EZ\8下混合编程#将-./0.1和^@QDAGaUDM@E开发系统相接合#以其功能强大%操作便利和利于升级维护#具有广泛的使用价值+参考文献!

&&’!刘志俭+

-./0.1应用程序接口用户指南&-’+北京$科学技术出版社#!"""+

&!’!飞思科技产品研发中心+

-./0.1%+;应用程序接口编程&-’+北京$电子工业出版社#!"",+

&,’!薛定宇+

科学运算语言-./0.1;+,程序设计与应用&-’+北京$清华大学出版社#!"""+

&#’!王振义+

-./0.1和^@QDAG233的混合编程&?’+雁北师范学院学报#!""!#&)(!)$!%(!’+

&;’!马海阳#

王艳华#孙道恒+-./0.1的^2编程接口浅析&?’+信息技术#!"",#!((,)$;;(;(+

&责任编辑!张!莉!

a%U2B

4^2G

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

作者:作者单位:刊名:英文刊名:年,卷(期):

陈建平, 罗先启

三峡大学,土木水电学院,湖北,宜昌,443002

三峡大学学报(自然科学版)

JOURNAL OF CHINA THREE GORGES UNIVERSITY(NATURAL SCIENCES)2004,26(6)

1.刘志俭 MATLAB应用程序接口用户指南 2000

2.飞思科技产品研发中心 MATLAB6.5应用程序接口编程 20033.薛定宇 科学运算语言MATLAB5.3程序设计与应用 2000

4.王振义 MATLAB和Visual C++的混合编程[期刊论文]-雁北师范学院学报 2002(02)5.马海阳;王艳华;孙道恒 MATLAB的VC编程接口浅析[期刊论文]-信息技术 2003(03)

1. 包军.孙小芳 MATLAB与FORTRAN程序的混合编程研究[期刊论文]-沈阳电力高等专科学校学报2002,4(3)

2. 彭玉珊.任向河.PENG Yu-shan.REN Xiang-he Matlab与 Fortran语言混合编程的接口技术[期刊论文]-电脑知识与技术(学术交流)2007,3(18)

3. 陈伟.谢敏.CHEN Wei.XIE Min Fortran与Visual C++混合编程[期刊论文]-云南水力发电2005,21(2)4. 周明莹 VB、VC++、Visual FORTRAN程序对MATLAB的调用[期刊论文]-电脑学习2005(1)

5. 邱勇云.邱相武.赵志安.Qiu Yongyun.Qiu Xiangwu.Zhao Zhian 工程软件中C++与FORTRAN之间数据传递方法研究[期刊论文]-计算机与数字工程2008,36(5)

6. 魏威.魏冲.WEI Wei.WEI Chong C、C++、Fortran混合编程研究[期刊论文]-洛阳大学学报2007,22(4)7. 贺红梅.包军 MATLAB与FORTRAN程序的接口技术[期刊论文]-电力学报2002,17(2)

8. 陈志英.张向强 将FORTRAN集成于环境下的混编方法研究[期刊论文]-计算机应用与软件2002,19(2)

9. 黄婷.苏欣欣.Huang Ting.Su Xinxin VC++调用Fortran子程序编程[期刊论文]-潍坊教育学院学报2010,23(5)10. 刘羽.LIU Yu Matlab与 Fortran的混合编程及其应用[期刊论文]-桂林工学院学报2005,25(1)

本文链接:/Periodical_whsldldxxb-yc200406021.aspx

本文来源:https://www.bwwdw.com/article/f4x4.html

Top