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

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

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 ,

ncols0 ,mxREAL) ;

x = mxGet Pr (prhs[0 ]) ;

z = mxGet Pr (prhs[1 ]) ;

548 三峡大学学报(自然科学版) 2004 年12 月y = mxGet Pr (plhs[0 ]) ;

/ 3 调用计算功能子程序myplus () 3 /

myplus (y ,x ,z) ;

}

上面程序为一典型的C 语言MEX 文件,程序由

两部分构成:一个计算功能子程序(myplus () 函数) 和

一个入口子程序(mexFunction () 函数) . 顾名思义,计

算功能子程序包含所有实际所需完成的功能、算法,

我们已有的或现编的C/ C + + 、FORTRAN 程序就被

当做计算功能子程序使用,它由入口子程序调用. 入

口子程序是MATLAB 系统和外部程序之间沟通的

桥梁,主要用来完成两者之间的通信. 上面示例程序

中,mexFunction () 函数有大量语句是用于检查变量

的数据类型等辅助性工作,这是必要的,因为MAT2

LAB 语言不像C/ C + + 等语言变量使用前须声明,

对类型的检查可以避免许多错误的发生.

下面简要的说明一下上面程序中用到的MAT2

LAB API 函数,它们在mex. h 或mat rix. h 中声明. mexFunction () ,入口子程序函数,其格式如下:

void mexFunction(int nlhs ,mxArray 3 plhs[ ] ,int

nrhs ,const mxArray 3 prhs[ ])

{

??/ / 一些必要的代码,用来完成MATLAB 系

统与计算功能子程序之间的通信

}

其参数的含意为:nrhs 和nlhs ,整型变量,分别为

调用MEX 文件时输入、输出参数的个数. prhs、plhs ,

指针数组,其元素分别为指向输入、输出参数的指针. mexErrMsgTxt () ,用于输出错误信息,并返回到

MATLAB 命令提示符下.

mxGetM() 和mxGetN ( ) ,获得矩阵的行数和列

数,参数为指向矩阵的指针,如程序中的mrows0 =

mxGetM(prhs[0 ]) 的作用为:得到第一个输入实参的

行数,并赋值给整型变量mrows0.

mxIsDouble () 、mxIsComplex () ,判断矩阵是否为

双精度型、复数型. 输入参数为矩阵指针,返回值为

BOOL 值.

mxCreateDoubleMat rix(int m ,int n ,mxComplex2

ity complexFlag) ,创建一个未赋值的双精度矩阵,m ,

n 为创建矩阵的行、列数,complexFlag 为标识是实数

还是复数. 该函数返回所创建矩阵的指针.

mxGet Pr () 获得矩阵实数部分的指针,输入参数

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

针.

MATLAB API 函数还包含其它许多接口函数,

分为mx2函数和mex2函数,详细情况可查阅相关文

献.

MEX 源程序编写完成后,还要经过编译后才能

生成dll 文件,供MATLAB 或其它程序调用,编译前

要对MATLAB 进行编译器的配置.

2. 2 编译器的配置

编译器的配置是通过MATLAB 的配置文件

(mexopt s. bat ) 进行的,其具体过程为: 在MATLAB 命令窗口下键入:mex2steup ,随后系统弹出一个DOS 窗口,按照提示一步步选择完成即可. 该命令可带许

多参数,可针对不同的操作系统进行多种配置[2 ,3 ] . 2. 3 C/ C+ + 语言MEX文件的编译

编译方法很简单,直接在MATLAB 命令提示符

下键入:mex filename ,其中filename 为需编译的源程序名. 如果提示有错误信息,需查错,修改源程序、调试. 直到没有错误信息提示. 编译通过生成的可执行的dll 文件,可在MATLAB 命令提示符下或其它程

序中调用.

3 FORTRAN语言MEX文件的实现

FORTRAN 语言MEX 文件的实现步骤和C/ C

+ + 语言MEX 文件大体相同.

3. 1 FORTRAN 语言MEX 文件的编写

MATLAB 提供了C/ C + + 和FORTRAN 两种

语言的接口,基于FORTRAN 语言和前面讲到的基

于C/ C + + 语言的MEX 文件在实现方式上相差不

大. 我们先还是看一下前面程序用FORTRAN 语言

MEX 文件来实现的源程序.

! 示例程序myplus. f :求两个数之和

! 计算功能子程序

subroutine myplus (y ,x ,z)

! 变量声明

real 3 8 x ,y ,z

y = x + z

return

end

! 以下是入口子程序

subroutine mexFunction(nlhs ,plhs ,nrhs ,prhs) ! 参数声明

integer nlhs ,nrhs ,plhs ( 3 ) ,prhs ( 3 )

! 调用API 库函数的声明

integer mxGet Pr ,mxCreateFull

integer mxGetM ,mxGetN ,mxIsNumeric

! 程序内部使用变量的声明

第26 卷第6 期陈建平等MATLAB 与C/ C + + 、FORTRAN 语言混合编程549 integer xpr ,ypr ,zpr

integer mrows ,ncols ,size

real 3 8 x ,y ,z

! 检查输入输出变量个数

if (nrhs. ne. 2) then

call mexErrMsgTxt (’Two input s arquired’)

elseif (nlhs. gt . 1) then

call mexErrMsgTxt ( ’Too many output argu2

ment s’)

endif

! 输入量必须是两个数

mrows = mxGetM(prhs (1) )

ncols = mxGetN(prhs (1) )

size = mrows 3 ncols

if (mxIsNumeric (prhs (1) ) . eq. 0) then

call mexErrMsgTxt (’Input s must be a number’)

endif

mrows = mxGetM(prhs (2) )

ncols = mxGetN(prhs (2) )

size = mrows 3 ncols

if (mxIsNumeric (prhs (2) ) . eq. 0) then

call mexErrMsgTxt (’Input s must be a number’)

endif

! 为输出参数创建矩阵

plhs (1) = mxCreateFull (mrows ,ncols ,0)

xpr = mxGet Pr (prhs (1) )

zpr = mxGet Pr (prhs (2) )

ypr = mxGet Pr (plhs (1) )

! 将数据指针转换成双精度型

call mxCopyPt r ToReal8 (xpr ,x ,size)

call mxCopyPt r ToReal8 (zpr ,z ,size)

! 调用计算功能子程序myplus

call myplus (y ,x ,z)

! 将计算结果传给输出数据指针

call mxCopyReal8ToPt r (y ,ypr ,size)

return

end

该程序的结构和内容与前面myplus. c 大致相

同,也是由两部分:一个计算功能子例行程序和一个

入口子例行程序构成,其程序中参数和变量大多相

同,这里就不一一再介绍了. 但值得一提的是, FOR2

TRAN 和C/ C + + 语言语法规则相差较大,在C/ C +

+ 语言中对字符大小写是敏感的,而FORTRAN 语

言中大小写是一样的;C/ C + + 语言中数组是按行存

储,数组下标是从0 开始计数的,而FORTRAN 语言

中数组是按列存储,数组下标从1 开始. C/ C + + 语

言几乎支持所有的数据类型,支持头文件,操作很灵

活. 而FORTRAN 语言,不支持指针,参数传输较麻

烦[1 ] .

3. 2 FORTRAN语言MEX文件的编译

和C/ C + + 语言MEX 文件一样,编译前需进行

编译器的配置,方法同前,只是选的编译器不同(例如Compaq Visual Fort ran version 6. 6) . 编译的过程也一样,MATLAB6 的编译命令(不再区分C/ C + + 文件

用cmex. bat ,FORTRAN 用fmex. bat) 统一使用mex.

bat 批处理命令,其后的文件名须带扩展名.

4 Visual Studio IDE 下MEX文件的建

立和调试

4. 1 Visual Studio 的配置

前面使用的mex 文件的使用方式,类似在DOS

下程序开发方式,程序编辑、编译、调试和执行分开,

每次只能创建一个文件,需要来回切换MATLAB 命

令窗口和编辑窗口,操作较麻烦. VC 是在Windows

环境下的优秀开发平台,将MATLAB 和VC 强强联

手,无疑是非常好的混合编程方式. 下面就简要介绍

一下如何在VC 的IDE( Integrated Development Envi2 ronment) 中编译MEX 程序. 为了表述的方便,我们以MATLAB6. 5 (安装在C: \ matlab6p5) 和Visual C +

+ 6. 0 (安装在D : \ Program Files \ Microsoft Visual Studio) 为例,可以分为以下5 步[4 ,5 ] :

①用VC 创建一个工程(假定名称为myproject) ,

类型选择Win32 Dynamic - link Library ,并将自己的MEX源程序和mexversion. rc (在C: \ MATLAB6p5

\ extern \ include 下) 加入到工程.

②创建一个与工程同名的定义文件(myproject .

def) ,内容如下:

L IBRARY myproject . dll

EXPORTS mexFunction

(如果是FORTRAN 该行改为EXPORTS -

MEXFUNCTION @16 )

并加入定义文件myproject . def 到工程

③定位库文件( . lib) 位置. 具体操作为:选择VC

下拉菜单Tools/ Options ?,在弹出的对话框Show di2

rectories for 下拉框中选择Library files ,在下部的Di2 rectories : 中添加C: \ MATLAB6p5 \ extern \ lib \

win32 \ microsoft \ msvc60 目录. 然后选择VC 下拉

菜单Project/ Settings ?, 在弹出的对话框中选择

550 三峡大学学报(自然科学版) 2004 年12 月Link 选项卡,在Category 栏中选择general 选项,在

出现的Object/ library modules : 框中填入libmx. lib , libmex. lib , and libmat . lib.

④加入MATLAB include 目录. 具体操作为:选

择VC 下拉菜单Tools/ Options ?,在弹出的对话框

Show directories for 下拉框中选择Include files ,在下

部的Directories : 中添加C: \ MATLAB6p5 \ extern

\ include 目录. 然后选择VC 下拉菜单Project/ Set2

tings ?, 在弹出的对话框中选择C/ C + + 选项卡,在

Category 栏中选择Preprocessor 选项,在出现的Pre2 processor definitions : 框中填入MATLAB-MEXFIL

E.

⑤最后就是调试运行配置. 具体操作为:选择VC

下拉菜单Project/ Settings ?,在弹出的对话框选择

Debug 选项卡,在Category 栏中选择General 选项,在

出现的Executable for debug session :框中填入C: \ MATLAB6p5 \ bin \ win32 \ matlab. exe.

4. 2 在Visual Studio 中使用MATLAB add - in

MATLAB6. X为Visual Studio IDE 提供了add -

in ,该add - in 使MATLAB 的M - files 非常容易的就

可加入到VC 环境中,使VC 和MATLAB 很好的融

合. 不过要使用该插件需要简单的配置. 具体操作如

下:

使用前面提到的mex - steup 命令进行编译器的

配置, 选择VC 作为编译器后, 该命令自动装载

MATLAB add - in. 然后选择VC 下拉菜单Tools/

Customize ?, 在弹出的对话框中勾选MATLAB add

- in 复选框. 随后VC 就出现了如图1 所示的工具

条,其中第一个按钮的功能就是用来将M - files 添加

到Visual Studio IDE 中的.

图1 图标示例

5 结语

本文对MATLAB 与C/ C + + 和FORTRAN 语

言进行混合编程的常用4 种方法进行了论述. 4 种方

法各有其优势,又各有不足. 其中MEX 文件的方式,

特别是Visual Studio IDE 下混合编程,将MATLAB

和Visual Studio 开发系统相接合,以其功能强大、操

作便利和利于升级维护,具有广泛的使用价值.

参考文献:

[1 ] 刘志俭. MATLAB 应用程序接口用户指南[M] . 北京:科

学技术出版社,2000.

[2 ] 飞思科技产品研发中心. MATLAB6. 5 应用程序接口编

程[M] . 北京:电子工业出版社,2003.

[3 ] 薛定宇. 科学运算语言MATLAB5. 3 程序设计与应用

[M] . 北京:清华大学出版社,2000.

[4 ] 王振义. MATLAB 和Visual C + + 的混合编程[J ] . 雁北

师范学院学报,2002 ,18 (2) :26~29.

[5 ] 马海阳,王艳华,孙道恒. MATLAB 的VC 编程接口浅析

[J ] . 信息技术,2003 ,27 (3) :55~57.

[责任编辑张莉]

第26 卷第6 期陈建平等MATLAB 与C/ C + + 、FORTRAN 语言混合编程551__

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

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、

fortran与matlab如何连接

编译环境配置: projects -> setting ->link -> Object/library modulus kernel32.lib libmx.lib libmat.lib libeng.lib integer engOpen,mxCreateDoubleMatrix,mxGetPr,engPutArray,engGetArray integer ep,p_matX,p_matY,p_matfi0,p_mat_ux,p_mat_uy,p_nbound integer status %启动引擎 ep=engOpen('matlab') if (ep .eq. 0) then write(6,*) 'Can''t start MA TLAB engine' stop endif % 在Matlab下执行语句 if (engEvalString(ep,'i_contour=0;').ne.0) then write(6,*) 'engEvalString failed' stop endif % 建立数组指针 pmatX=mxCreateDoubleMatrix(ndiv,ndiv,0) % 建立该数组在Matlab工作空间的名字 call mxSetName(pmatX, 'matX') % 从Matlab工作空间获取变量建立连接fi0(Matlab)→ p_matfi0 (Fortran) p_matfi0=engGetArray(ep,'fi0'); (注: p_matfi0指针是联系Fortran变量和Matlab变量的通道和桥梁) % 更新Fortran数组p_matfi0 (Fortran)→fi0 (Fortran) call mxCopyPtrToReal8(mxGetPr(p_matfi0),fi0,(nx+2)*(ny+2)) % fi0 (Fortran)→ p_matfi0 (Fortran) call mxCopyReal8ToPtr(fi0,mxGetPr(p_matfi0),(nx+2)*(ny+2)) % p_matfi0 (Fortran)→fi0(Matlab) status = engPutArray(ep,p_matfi0) if (status.ne.0) then write(6,*) 'engPutMatrix failed'

(完整版)matlab基本语句

第2章M ATLAB程序设计 MATLAB语言为解释型程序设计语言。在程序中可以出现顺序、选择、循环三种基本控制结构,也可以出现对M-文件的调用(相当于对外部过程的调用)。 由于 MATLAB开始是用FORTRAN语言编写、后来用 C语言重写的,故其既有FORTRAN的特征,又在许多语言规则方面与C语言相同。 2.1 顺序结构语句 在顺序结构语句中,包括表达式语句、赋值语句、输入输出语句、空语句等。

2.1.1 表达式语句 格式: 表达式,%显示表达式值 表达式;%不显示表达式值 表达式%显示表达式值 如: x + y, sin(x); –5 最后的表达式值暂保存在变量ans中。 2.1.2 赋值语句 格式: v =表达式,%结果送v并显示v v =表达式;%结果送v不显示v v =表达式%结果送v并显示v 2.1.3 空语句 格式: , ; 2.1.4 输入语句

1、input语句(实际上是函数) 格式1: input(提示字符串) 功能: 显示提示字符串,可输入数字、字符串(两端用单引号括起)、或表达式 格式2: input(提示字符串,'s') 功能: 显示提示字符串,并把输入视为字符串 2、yesinput语句 格式: yesinput(提示字符串,缺省值,值范围) 功能: 显示提示字符串和缺省值,若只打入回车则以缺省值作为输入值,若输入的值不在指定范围内则认为输入无效,B并等待用户重新输入。 如: t=yesinput('指定线的颜色',… 'red','red|blue|green') 运行结果如下: 指定线的颜色(red):yellow %不在值内

Matlab中文教程共63页

MatLab简介 MATLAB是什么? 典型的使用包括: 数学和计算 算术发展模型, 模拟,和原型 数据分析,开发,和可视化 科学和工程图学 应用发展包括图形用户界面设计 MATLAB表示矩阵实验室。 MATLAB系统 MATLAB系统由5主要的部分构成: 1. MATLAB语言。这是高阶的矩阵/数组语言,带控制流动陈述,函数,数据结构,输入/输出,而且面向目标的编程特点。 Ops 操作符和特殊字符。 Lang 程序设计语言作。 strfun 字符串。 iofun 输入/输出。

timefun 时期和标有日期。 datatypes数据类型和结构。 2. MATLAB工作环境。这是你作为MATLAB用户或程序编制员的一套工具和设施。 3. 制图这是MATLAB制图系统。它为2维上,而且三维的数据可视化,图象处理,动画片制作和表示图形包括高阶的指令在内。它也为包括低阶的指令在内,允许你建造完整的图形用户界面(GUIs),MATLAB应用。制图法功能在MATLAB工具箱中被组织成5文件夹: graph2d 2-的维数上的图表。 graph3d 三维的图表。 specgraph 专业化图表。 graphics 制图法。 uitools 图形用户界面工具。 4. MATLAB的数学的函数库。数学和分析的功能在MATLAB工具箱中被组织成8文件夹。 elmat 初步矩阵,和矩阵操作。 elfun 初步的数学函数。 specfun 专门的数学函数。 matfun 矩阵函数-用数字表示的线性的代数。 datafun 数据分析和傅立叶变换。 polyfun 插入物,并且多项式。

FORTRAN学习中的一些小心得

FORTRAN 心得 第一部分:一些小心得 1Fortran不区分大小写 2 Fortran有5种基本数据类型,integer,real, character, logical, complex 3 fortran fixed format格式中的变量赋初值一般用DATA,因为它不能用:: 4 real(kind=8) a这种格式只使用于Fortran90,Fortran77中要使用real*8或real(8) 5 FORTRAN中FREE与FIXED两种格式do循环的区别: Fortran 95使用end do来结束循环。 Fortran 77使用DO循环要麻烦一点,它不使用END DO来结束循环,而是使用行号来结束循环,程序代码要在DO的后面写清楚这个循环到哪一行程序代码结束。 Fortran 77中,经常会使用CONTINUE这个命令来结束循环。因为CONTINUE这个命令没有实际的用途,刚好可以拿来做封装使用。 6 循环的流程控制: 循环中的cycle命令相当于c++里的continue命令,用于结束一次循环 循环中的exit命令好比c里面的break,用于结束循环 7 不使用do循环,单纯用GOTO语句也能设计循环程序,但不推荐使用GOTO语句 7 fortran有等价声明:即用equivalence(a,b),这样使得a,b使用同一块内存,这样可以节省内存,有时可精简代码。 8 fortran77中只能用单引号。(还有疑问,因为fixed format能用双引号) 9 逻辑运算符 == /= > >= < <= !Fortran90用法 .EQ. .NE. .GT. GE. .LT. .LE. !Fortran77用法 9 PAUSE,CONTINUE,STOP pause 暂停程序执行,按enter可继续执行 continue 貌似没什么用处,可用作封装程序的标志 STOP 命令用来结束程序,要谨慎使用 10 数组元素之间要用逗号分隔,而不能像matlab一样既可以用逗号也可以用空格,fortran 的数组元素之间不能用空格。 11 数组的声明: Fortran 77中数组的声明,必须使用DIMENSION命令 Integer a; !先声明a是整型 Dimension a(10) !再声明a是大小为10的数组 Fortran 95中可以用简单的方法: Integer a(10) !最简单的方法 Integer,dimension(10):: a !另一种方法 12 数组的赋值: Fortran 77中数组的声明,可以使用DATA命令或隐含式循环来赋初值; Fortran 95中可以直接设置初值;如:integer ::a(5)=(/1,2,3,4,5/);此时,括号和除号之间不能有空格;

(完整版)《MATLAB语言及其应用》教案

MATLAB语言及其应用 教 案 任课教师:罗靖宇 任课班级:09通信(1)(2) 教材:MATLAB程序设计与应用(第二版) 作者:刘卫国主编出版社:高等教育出版社

内容: 书籍简介:本书以MATLAB 7.0版为蓝本介绍MATLAB功能与应用强调理论和实践相结合贴近读者需要注重讲清有关数学方法和算法原理前提下介绍MATLAB功能;注重和有关学科领域结合,突出应用书中有许多应用实例些实例既是对MATLAB重点和难点诠释又可以更好地帮助读者应用MATLAB来解决实际问题具有很强代表性。 全书分为基础篇应用篇和实验篇基础篇包括MATLAB系统环境MATLAB数据及其运算MATLAB矩阵分析与处理 MATLAB程序设计MATLAB图MATLAB数值计算MATLAB符号计算应用篇包括MATLAB图形用户界面设计MATLAB Notebook使用MATLAB Simulink 仿真软件MATLAB外部程序接口技术MATLAB应用实验篇和教学内容相配合包括15实验以帮助读者更好地上机操作。本书可作为高等学校理工科各专业大学生或研究生学习教材也可供广大科技工作者参考。 第1章MATLAB系统环境 1.1 MA TLAB概貌 1.1.1 MA TLAB 发展 1.1.2 MA TLAB 主要功能 1.1.3 MA TLAB功能演示 1.2 MA TLAB环境准备 1.2.1 MA TLAB 安装 1.2.2 MA TLAB 启动与退出 1.3 MA TLAB操作界面 1.3.1 主窗口 1.3.2 命令窗口 1.3.3 工作空间窗口 1.3.4 当前目录窗口和搜索路径 1.3.5 命令历史记录窗口 1.3.6 Stalt菜单 1.4 MA TLAB帮助系统 1.4.1 帮助命令 1.4.2 帮助窗口 1.4.3 演示系统 第2章MATLAB数据及其运算 2.1 MA TLAB数据特点 2.2 变量及其操作 2.2.1 变量与赋值 2.2.2 变量管理 2.2.3 数据输出格式 2.3 MA TLAB矩阵表示 2.3.1 矩阵建立 2.3.2 冒号表达式 2.3.3 矩阵拆分 2.4 MA TLAB数据运算 2.4.1 算术运算 2.4.2 关系运算 2.4.3 逻辑运算 2.5 字符串 2.6 结构数据和单元数据 2.6.1 结构数据 2.6.2 单元数据 第3章MATLAB矩阵分析与处理 3.1 特殊矩阵 3.1.1 通用特殊矩阵 3.1.2 用专门学科特殊矩阵 3.2 矩阵结构变换 3.2.1 对角阵与三角阵 3.2.2 矩阵转置与旋转 3.3 矩阵求逆与线性方程组求解 3.3.1 矩阵逆与伪逆 3.3.2 用矩阵求逆方法求解线性方程组 3.4 矩阵求值 3.4.1 方阵行列式值 3.4.2 矩阵秩与迹 3.4.3 向量和矩阵范数 3.4.4 矩阵条件数 3.5 矩阵特征值与特征向量 3.6 矩阵超越函数 第4章MATLAB程序设计 4.1 M文件 4.1.1 M文件分类 4.1.2 M文件建立与打开 4.2 程序控制结构 顺序结构、选择结构、循环结构 4.3 函数文件 4.4 程序调试 第5章MATLAB绘图 5.1 二维图形

Fortran调用matlab作图示例

Fortran调用matlab,在这里实现,是通过系统调用了matlab程序,matlab程序运行了一个model模块。具体示例操作如下: 说明:实例用的是CVF+matlab7.1 不过相信都是一样的,因为代码跟编译器无关。 该实例来自网络,程序内容是用fortran自动生成一个随机矩阵,然后将矩阵的转置写入一个txt文件,然后用系统调用matlab程序,读取文件,求特征值,然后对特征值进行某变化后作图。更多关于matlab读取已有文件的知识可以找相关书籍参考。 1、Fortran中编写代码: program main implicit none integer,parameter :: rows=100, cols=100 real*8 :: M(rows,cols) integer :: i call random_seed() call random_number(M) open(100,file='matrix M.txt') write(100,'(E25.15)') transpose(M) close(100) call system("matlab -r test") end program main 2、Matlab建立一个test.m 文件,注意后缀,是model文件,编写为:

clear all; close all; clc; M=load('matrix M.txt'); eigvalues=eig(M); plot(real(eigvalues),imag(eigvalues),'-r*'); title('矩阵M的特征值'); xlabel('特征值实数部分'); ylabel('特征值虚数部分'); 3、注意,test.m文件要放在编译完成的Fortran文件的工程文件夹下。Matlab软件一定是安装版的,这样系统才能调用。第一次安装后,需要重启电脑一次,系统才能确认自动调用matlab程序。 代码可以完全拷贝过去运行,没有问题。祝成功!

(完整版)fortran函数总结,推荐文档

附录C SCILAB 部分函数指令表 (c)LIAMA. All rights reserved. (注解:本指令表只收集了部分常用指令, 有关全部指令请参照文档文件) + 加 - 减 * 矩阵乘 数组乘 *. 1. 通用指令 ^ 矩阵乘方 数组乘方 ^. \ 反斜杠或左除 help 在线帮助 / 斜杠或右除 apropos 文档中关键词搜寻 或.\ 数组除/. ans 缺省变量名以及最新表达式的运 算结果 == 等号 ~= 不等号 clear 从内存中清除变量和函数 < 小于 exit 关闭SCILAB > 大于 quit 退出SCILAB <= 小于或等于 save 把内存变量存入磁盘 >= 大于或等于 exec 运行脚本文件 &,and 逻辑与 mode 文件运行中的显示格式 |,or 逻辑或 getversion 显示SCILAB 版本 ~,not 逻辑非 ieee 浮点运算溢出显示模式选择 : 冒号 who 列出工作内存中的变量名 ( ) 园括号 edit 文件编辑器 [ ] 方括号 type 变量类型 { } 花括号 what 列出SCILAB 基本命令 小数点 . format 设置数据输出格式

, 逗号 chdir 改变当前工作目录 ; 分号 getenv 给出环境值 // 注释号 mkdir 创建目录 = 赋值符号 pwd 显示当前工作目录 ' 引号 evstr 执行表达式 ' 复数转置号 转置号 '. ans 最新表达式的运算结果 2.运算符和特殊算符%eps 浮点误差容限, =2 -52 ≈ 2.22×10 -16 %i 虚数单位= √(-1) %inf 正无穷大 %pi 圆周率, π=3.1415926535897.... 3. 编程语言结构 abort 中止计算或循环 break 终止最内循环 case 同select 一起使用 continue 将控制转交给外层的for或 while循环 else 同if一起使用 elseif 同if一起使用 end 结束for,while,if 语句 for 按规定次数重复执行语句 if 条件执行语句 otherwise 可同switch 一起使用 pause 暂停模式 return 返回 select 多个条件分支 then 同if一起使用 while 不确定次数重复执行语句 eval 特定值计算 feval 函数特定值计算或多变量计算 function 函数文件头 global 定义全局变量

如何在ANSYS中调用其他程序(matlab, C, fortran)和数据交换

ANSYS虽然比较强大,但是不能象Femlab一样自定义模型方程。在某些情况下,必须用当前step的解作为条件,根据某些物理条件来改变单元的材料属性以及载荷,作为下一个step的初始条件。用ANSYS自带的APDL可用于一般的流程控制,如果要实现特定的复杂物理模型就比较困难,而且速度极慢。可行的办法就是在ANSYS运行中把每一个step的结果传给外部程序,用来计算下一步的载荷和单元属性。 A. 和外部程序交换数据,首先要处理好协同问题,一般可用一下两种方法:(1)ANSYS 和外部程序同时运行 -- 需要建立一个flag文件。通过在ANSYS 和程序中读其内容来判断对方是否在运行。在ANSYS和外部程序运行完一个step,改变flag,告诉对方自己当前运行结束,对方可以继续运行,否则必须等待。 (2)在ANSYS中调用/SYS命令执行外部程序。此时ANSYS会暂时停止运行,直到外部程序结束运行,把执行权交还给ANSYS。 (1)适用与matlab等非编译语言。(2)适用与C和Fortran等编译语言。 B. 如何在外部程序中告诉ANSYS改变单元属性和载荷变化: 在从ANSYS中导入数据后,外部程序一般可以根据具体物理模型来创建.mac文件,然后在此文件中写入MPCHG等APDL命令。例如用C创建一个"MD.mac"文本文件,用fsprintf(fp,"MPCHG %d,%d", element_num, Material_ID). 当程序结束运行,在ANSYS中用*use, MD.mac 来实现加载和单元属性的改变。 C. 如何在ANSYS和外部程序中传递数据。 一般在ANSYS中把当前结果写在数据文件中,在外部程序中读取。一般常用的命令有*MOPER。*MOPER可以把节点(node)的结果例如T(x,y,z) 自动根据插值计算映射到用户自己定义的网络上。然后可以用*MWRITE写入数据文件。例如,

MATLAB与FORTRAN接口技术

MAT LAB与F ORT RAN接口技术 枣庄学院数学与信息科学系 赵晓艾 [摘 要]介绍了动态链接函数库M EX文件,MAT文件及MAT LAB引擎的调用原理,利用MAT LAB和F ORT RAN接口技术实现F ORTRAN程序计算结果的可视化过程。 [关键词]MAT LAB F ORTRAN AP I MAT LAB是一种面向科学与工程计算的高级语言,凭借其强大的科学计算与可视化功能,简单易用的开放式可扩展环境,取得了在矩阵代数、数值计算、数字信号处理、动态仿真﹑神经网络控制等领域的广泛应用。:它语言简洁,使用方便灵活,程序书写形式自由,图形功能强大。MAT LAB扩充能力强,交互性好,有丰富的库函数,它包含了大量的MAT LAB与C/F ORTRAN语言之间的接口函数,在进行复杂数学运算时可以直接调用,这些接口函数是MAT LAB的一个非常重要的组成部分。虽然MAT LAB是一个完全独立的编程和数据运算的集成环境,使用它可以方便地完成许多工作,但是,很多时候仅靠MAT LAB环境还是不能很好的完成任务,例如:MAT LAB中程序循环,其它语言编写的算法的移植要重新编写M文件等。 F ORT RAN语言是传统的数值处理语言,处理速度高,编程简便,其强大的数值计算能力和长期积累的大量的科学计算程序库及工程应用软件,始终占据着科学和工程计算领域的重要地位,有很多源代码资源可供使用,但它在图形功能方面有较大的不足。 MAT LAB提供的AP I(App licati on Pr ogra m I nterface)弥补了彼此的不足,它支持MAT LAB与外部数据和程序的交互。MAT LAB接口包括:在MAT LAB环境中调用其它语言编写的程序和算法,通过M EX文件实现;MAT LAB与其它编程环境的数据交互,通过MAT文件实现;其它编程环境使用MAT LAB的计算绘图功能,通过MAT LAB计算引擎实现。 1MEX文件 1.1M EX文件介绍 M EX文件是由C/F ORTRAN语言编写的,编译后生成MAT LAB动态链接子程序,可MAT LAB中导入和执行,如同MAT LAB的内置函数一样,主要应用有:对已有的C/F ORTRAN 程序,可通过MEX方式在MAT LAB环境中直接调用;对影响MAT LAB执行速度的F OR循环,可以编写相应的C/F ORTRAN 子程序完成相同的功能,并编译成MEX,提高运行速度。F OR2 TRAN语言MEX文件通常由两部分组成: (1)入口子程序,是计算子程序与MAT LAB环境之间的接口,用来完成相互之间的调用。 其程序的入口点由函数mexFuncti on定义,入口子程序函数的说明格式如下: c人口子程序 subr outine mexFuncti on(nlhs,p lhs,nrhs,p rhs) c参数声明: integer p lhs(3),p rhs(3) integer nlhs,nrhs 其中p rhs是指向输入变量的mx A rray类型指针,nrhs是输入变量的个数,p lhs是指向输出变量的mx A rray类型指针,nlhs 是输出变量的个数。 (2)计算子程序,是完全的F ORTRAN语言编程,不涉及到任何的接口内容,这部分程序可以单独编写一个子程序或程序子函数。 M EX文件的使用极为方便,只需在提示符下键入MEX文件名即可,与MAT LAB的内建函数的调用方式完全相同,当执行M EX文件时,MAT LAB系统将首先搜索MAT LAB系统的所有可搜索路径(通过路径浏览器设置),然后载入并执行第一个与用户键入的文件名相匹配的可执行文件。在MAT LAB中,由于M EX文件的执行优先级高于M文件,所以即使一个文件名同时存在两种类型的可执行文件中,也会先执行MEX文件。 F ORT RAN语言的几个常用MEX函数 : 1.2MEX文件调用的基本原理 MAT LAB和F ORTRAN语言的运算单位不同,MAT LAB以矩阵(mx A rray结构体)为基本数据结构,而在F ORTRAN中,文件是由按顺序排列的记录组成的,而记录是数值或字符的序列,是F ORTRAN程序输入输出的基本单位。记录有两种格式:格式记录和无格式记录。格式记录中,数据在文件中的存放是用ASC II码形式;无格式记录中,数据在文件中存放是用二进制代码形式。由于F ORT RAN和MAT LAB的数据类型不能直接匹配,故需调用MAT LAB的AP I函数来完成二者的数据转换,其基本原理是:MAT LAB将需要传递的mx A rray型数据的内存地址作为一个整型数值传递给F ORT RAN程序,然后在F OR2 T RAN中,AP I提供的访问函数(access r outiness)使用此整数值来访问mx A rray的内容,并将此值作为内存地址,读取相应内容。 传统的F ORTRAN77不支持指针变量,因此必须借助MAT LAB的AP I函数;在F ORT RAN90中,可以通过%val直接使用数据而无须调用子例行程序mxCopyPtrT oReal8和mxCopy2 Real8T oPtr。 1.3MEX文件的编译 要编译生成的MEX文件,必须确认已经安装了MAT LAB 应用接口组件及其相应工具,并且要有合适的F ORTRAN语言编译器,在W indows平台下,所使用的编译器必须支持32位的W indows动态链接库(DLL)。 MAT LAB的AP I支持许多编译器,并针对不同的编译器提供不同的选项文件,在生成M EX文件之前必须为编译器配置合适的选项文件。在MAT LAB命令窗口中键入命令:mex–setup,按提示逐步完成,配置完后,使用命令:mex–f(选项文件名)(源文件名)对源文件进行编译。 2MAT LAB与F ORT RAN数据共享 MAT LAB提供了多种数据输入输出方式,用户可以根据需要灵活选择,MAT LAB与F ORT RAN实现数据共享有以下几种方式: 2.1AS C II码方式 AS C II是计算机中用得最广泛的字符集及其编码,ASC II码的数据文件中的数据形式必须是一个矩阵,要求数据文件每一行的数据个数必须相同,每行数据对应于矩阵的每一行,每行的元素用空格分开。把F ORT RAN输出数据保存为ASC II码文件形式,在MAT LAB中用:l oad文件名(带扩张名),该语句在MAT LAB工作空间创建一个与文件名(无扩展名)相同的变量,该变量表示的矩阵即是AS C II码文件的数据组成的矩阵。 2.2底层I/O方式 — 5 8 1 —

Matlab语言及应用论文

一、MATLAB简介 MATLAB 是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。 MATLAB是矩阵实验室(Matrix Laboratory)的简称,和Mathematica、Maple 并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。 MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且mathwork也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。在新的版本中也加入了对C,FORTRAN,C++ ,JAVA的支持。可以直接调用,用户也可以将自己编写的实用程序导入到MATLAB函数库中方便自己以后调用,此外许多的MATLAB爱好者都编写了一些经典的程序,用户可以直接进行下载就可以用。 二、应用 MATLAB 产品族可以用来进行以下各种工作: (1)数值分析; (2)数值和符号计算; (3)工程与科学绘图; (4)控制系统的设计与仿真; (5)数字图像处理技术; (6)数字信号处理技术; (7)通讯系统设计与仿真; (8)财务与金融工程。 MATLAB 的应用范围非常广,包括信号和图像处理、通讯、控制系统设计、测试和测量、财务建模和分析以及计算生物学等众多应用领域。附加的工具箱(单独提供的专用 MATLAB 函数集)扩展了 MATLAB 环境,以解决这些应用领域内特

matlab、ansys数据的相互调用(最新整理)

matlab中 save('E:\ansys\opt\zs\try\dam.txt','dd','-ascii') !D:\Ansys\v90\ANSYS\bin\intel\ansys90 -b -p ane3fl -i ... E:\ansys\opt\zs\try\yh2.mac -o E:\ansys\opt\zs\try\yh.out load('-ascii','E:\ansys\opt\zs\try\zx.txt') 第一行是matlab中数据dd保存为ansys可读的形式 第二行是调用ansys计算(一共三个路径,第一个是ansys程序的,第二三个分别为输入输 出文件的路径) 第三行是matlab调用ansys的结果 ansys中 读matlab数据的命令流 *dim, xx,, 15,1 *VREAD,xx,E:\ansys\opt\zs\try\dam,txt,,ijk,15 (15f16.6) 写数据的命令流 finish /post1 !将模态分析结果写入txt文件 *mwrite,zx,E:\ansys\opt\zs\try\zx,txt,,ijk,16 (16f16.6) *vread和*mwrite的具体解释看看帮助吧 还有一个问题是ansys必须是命令流形式,最好保存为mac格式,这样可以直接运行 一点有益的补充: 1。当matlab调用的时候,可以采用!的方式和system函数两种方式。注意第一个 ansys80这个可执行文件目录中不能有空格,否则matlab不能识别。即可以采用如下的调 用方式: system('D:\ANSYS\v80\ANSYS\bin\intel\ansys80 -b -p ane3fl -i C:\sibian.dat -o C:\vm5.out') 2。这部分是关于batch的使用的,应尽量避免目录中的空格,减小不必要的麻烦。下边的batch模式是正确的。 "D:\ANSYS\v80\ANSYS\bin\intel\ansys80" -b -p ane3fl -i C:\sibian.dat -o C:\vm1.out 我的经验是输入文件和输出文件的目录不能太长,且最好不带空格。刚刚开始的时候我的 输入文件的目录是C:\Documents and Settings\Administrator\sibian.dat,结果batch不能执行。改为C:\sibian.dat 即可执行了。 3。*vread的例子,关于这个命令的帖子很多了,这里重复一下,算是方便新手了。 For example, given the following data file named dataval: 1.5 7.8 1 2.3 15.6 -45.6 42.5 采用如下命令流读入: *create,ff *DIM,EXAMPLE,,2,3 *VREAD,EXAMPLE(1,1),dataval,,,JIK,3,2

相关主题
相关文档
最新文档