Fortran与matlab在数组上的对比
MATLAB与FORTRAN混合编程接口程序技术的研究

如 果 你 的 F R R N 编译 器 如 F R R N 0等 支 持 %vl 构 。 O TA OTA 9 a结 即 用 户 可 以在 程 序 中 讲 一 个 变 量 声 明为 指 针 类 型 , 时 对 数 据 的 访 这
包 等 。 是 现 在 国际 上 流 行 的许 多 大 型软 件 都 是基 于 F R R N、 但 O TA C、+ 这 些 语 言 开 发 的 ,因此 在这 些 领 域 仍 然 有 着 不 可 替 代 的 地 C+ 位。 MA L B( a i L brtr) 言 是 一 种 以 矩 阵 ( tx 和 阵 T A M tx aoa y 语 r o mai) r 列 (r y 为 基 本 编 程 单 元 的 , 有 完 整 的控 制 语 句 、 据 结 构 、 aa) r 拥 数 函 数 编 写 与 调 用 格 式 等 具 有 面 向 对 象 程 序 设计 特 征 的 高 级 程 序 设 计 语 言 。读 者 不但 可 以 利 用 它 方 便 快 捷 地 完 成 小 规 模 的 算 法 验
交 换 的 m A ry结 构 体 的 内 存 地 址 作 为 一 个 整 型 数 值 传 递 给 xr a
Matlab与Fortran的混合编程及其应用

桂 林 工 学 院 学 报
JOURNA L OF GU IL I N UN I V ERS I TY O F TECHNOLOGY
V o.l 25 N o . 1 Jan 2005
文章编号: 1006- 544X ( 2005) 01- 0076- 05
Matlab与 Fortran的混合编程及其应用
刘
( 1 中国地质大学 地球物理与空间信息学院, 武汉
羽
1 ,2
430074 ; 2 桂林工学院 电子与计算机系 , 广西 桂林
541004)
摘 要 : 介绍和分析了 M atlab与 Fortran混合编程的两种方式 , 即利用 M ex文件和利用 M atlab 引擎; 给出了其具体实现方法 , 并讨论了各自的优缺点和适用情况; 给出了一个物探数据可 视化的应用实例. 分析和实验结果表明: 通过 M atlab与 Fortran混合编程, 不仅可以利用 M at lab强大的图形功能和丰富的工程计算函数, 还能发挥 Fortran数值运算高效的特点和利用其原 有的大量程序资源 , 从而使编程更为灵活、高效. 如 Fortran程序中有大量交互输入, 宜采用 M atlab引擎混合编程方式; 如 Fortran中要调用的 M atlab函数较多 , 则应考虑采用 M ex 文件混 合编程 . 关键词 : M atlab; Fortran; 混合编程; 接口 中图分类号 : TP311 文献标识码 : Ay
c 给输出矩阵命名, 即 M atlab中名为 T callm xSet N am e( T, T ) c 将数组 tm i e复制到输出矩阵 T callm xCopyReal8T oPtr( tm i e , m xG etP r( T), 10 ) c 将输出矩阵写入 M atlab工作空间 call engPuM t atrix( ep , T) c 调用 M atlab函数 call engEvalString( ep, D= 5 * ( - 9 8) * T ^2 ; ) call engEvalString( ep, p lot( T, D); ) call engEvalString( ep, title( Position vs . Tm i e) ) call engEvalString( ep, x label( T m i e ( seconds) ) ) call engEvalString( ep, ylabel( Position ( m eters) ) ) c 暂停, 以便看显示的图形, 按任意键继续 read( * , * ) call engEvalString( ep, close ; ) 从工作空间获取结果矩阵 D = engGeM t atrix( ep , D ) c 将结果矩阵复制到数组 d ist callm xCopyP tr T oReal8( m xG etPr( D) , d is, t 10) c 进行后续处理 prin t* , M atlab com pu ted the follow ing d istances : prin t* , tm i e( s) distance( m ) do 10 i= 1, 10 c 显示结果 prin t* , tm i e( i) , d ist( i) 10 con tinue callm xFree M atrix( T) callm xFree M atrix( D) call engC lose( ep) stop end
MATLAB与FORTRAN接口技术

n e e l sn h i tg rn h , r s
0 引言
MA L T AB 是一种面 向科学与工程计算 的高级语言 ,凭 借其强大的科 学计 算与可视 化功能, 简单易用的开放式可扩 展环境,取得了在矩 阵代数 、数 值计算、数 字信号处理、动 态仿真 、神经 网络控制等领 域的广泛应用 。: 言简洁 , 它语 使 用 方 便 灵 活 , 程 序 书 写 形 式 自由 , 图 形 功 能 强 大 。 MA L T AB 扩充能力强,交互性好 ,有丰富的库函数 ,它包 含了大量 的 MA L T AB 与 CF R R /O T AN 语言之间的接 口函 数, 在进行复杂数学运算 时可以直接 调用 ,这些接 口函数是 MA L T AB 的一个非常重要 的组成部分 。虽然 MA L T AB 是 个 完全独立 的编程和数据运算 的集成环境 , 使用它可以方 便地 完成许 多工作 ,但是 ,很多 时候仅靠 MA L T AB环境 还 是不能很 好的完成任 务,例 如:MA AL 中程 序循 环,其 T B 它语言编写 的算法 的移植要重新编写 M 文件 等。 FRR O T AN 语言是传统的数值处理语言,处理速度高, 编程简便 , 其强大的数值 计算 能力和长 期积 累的大量 的科 学 计算程序库及工程应用软件 , 始终 占据 着科 学和 工程 计算 领 域 的重要地位 , 有很 多源代码资源可供使用 , 它在 图形功 但 能方而有较大 的不足 。
Matlab技术与其他编程语言的比较分析

Matlab技术与其他编程语言的比较分析概述在计算机科学和数据处理领域,编程语言扮演着至关重要的角色。
Matlab是一种功能强大的编程语言,特别适用于数值计算和数据可视化。
然而,与其他编程语言相比,Matlab在某些方面可能存在一些限制。
本文将比较Matlab与其他常见编程语言的关键方面,包括语法、性能、库和应用领域等,以便读者更好地理解其优势和局限性。
语法比较首先,我们来比较Matlab与其他编程语言的语法。
与C、Java和Python等传统编程语言相比,Matlab的语法更简洁、更直观。
由于其专注于数值计算和科学工程应用,Matlab的语法更加贴近数学表达式的形式,因此对于进行矩阵运算和复杂数学计算的用户来说,Matlab更易于上手。
然而,Matlab缺乏一些高级的面向对象编程的功能,这一点与Python和Java等语言相比略显不足。
性能比较性能对于编程语言的选择至关重要。
在这方面,Matlab的性能可能不如C或Fortran等编译型语言。
由于Matlab是一种解释性语言,因此它的执行速度较慢。
这意味着在需要高度优化和性能敏感的应用场景下,其他编程语言可能更适合。
然而,Matlab通过使用JIT(即时编译)技术和并行计算工具包等方式,可以在一定程度上提高其性能,使其能够处理大规模的计算任务。
库和工具比较编程语言的生态系统取决于其可用的库和工具。
在这方面,Matlab拥有丰富的工具包和函数库,如信号处理工具包、图像处理工具包和控制系统工具包等。
这些工具包提供了方便的函数和算法,使得Matlab在信号处理、图像处理和控制系统设计等领域具有显著的优势。
然而,与其他语言相比,Matlab的库和工具包可能不如Python和R等语言那样多样化和广泛。
特别是在机器学习和深度学习等领域,Python的库(如TensorFlow和PyTorch)更为流行和丰富,使用者更多。
应用领域比较不同的编程语言在不同的领域具有不同的优势。
matlab和fortran混合编程

matlab和fortran混合编程matlab2016b+vs2010+ivf2013+f90其实默认是f77语法,但通过配置可以改变为⾃由格式。
默认只能f77代码,怎样修改:找到:mex_FORTRAN_win64,删掉fixed就可以⽤f90了。
⼤体过程:1.在matlab中配置fortran编译环境: mex -setup FORTRAN2.写好源代码,⾃定义⼦函数仍可以像往常⼀样调⽤别的⼦函数3.将matlab当前路径调整到当前源代码⽂档所在路径4.在matlab命令⾏输⼊编译命令:mex csuherror.f905.像使⽤matlab内置函数⼀样使⽤此函数,error=csuherror(X),其中X为csuh的9个参数(包括C),输出的为计算误差6.若需要调试,需要这样编译:mex -g csuherror.f90 ,之后通过vs附加matlab到进程,并打开源代码加断点,在matlab运⾏时就可以调试了,具体请参考帮助⽂档。
下⾯是⼀个例⼦:先写fortran代码:传⼊⼀个数组和⼀个数字,输出⼀个数组Add.f90 ,注意此⽂档名为将来matlab调⽤的函数名,调⽤函数名时与其内的⼦函数名称Add⽆关。
1 #include "fintrf.h" !必须有的头⽂件,⾥⾯有mxGetPr, mxGetM, mxGetN,mxCreateDoubleMatrix等函数的申明 /post/1d001431_ab72071234 subroutine mexFunction(OutSum,OutVar,InSum,InVar)!函数接⼝名称必须为mexFunction,567 !OutSum:输出参数个数8910 !OutVar:输出参数数组指针111213 !InSum:输⼊参数个数141516 !InVar:输⼊参数数组指针171819 !参数顺序不能随意更改20 Integer InSum,OutSum212223 mwPointer InVar(*),OutVar(*) !mwPointer专门⽤于表⽰指针变量,这个不能随意⽤Integer代替2426 mwPointer mxGetPr, mxGetM, mxGetN,mxCreateDoubleMatrix !这个对返回指针函数的再次申明,27 integer, parameter :: fp = selected_real_kind(15,300)28 Integer , parameter :: myINT = SELECTED_INT_KIND( 8 )293031 Real(fp),Allocatable::x(:,:),y(:,:)32 real(fp)::z333435 Integer m,n363738394041 If(InSum/=2)Then424344 call mexErrMsgIdAndTxt('MATLAB:InputTooBig','输⼊参数个数必须为2个')454647 Return484950 EndIf515253545556 m=mxGetM(InVar(1))!获取第1个输⼊参数的⾏数575859 n=mxGetN(InVar(1))!获取第1个输⼊参数的列数606162 Allocate(x(m,n),y(m,n))636465 Call mxCopyPtrToReal8(mxGetPr(InVar(1)),x,m*n)!将第1个参数数组赋值给x变量666768 Call mxCopyPtrToReal8(mxGetPr(InVar(2)),z,1)!将第2个整数变量赋值给z6970717273 Call Add(x,y,z,m,n)!调⽤内部函数747576777879 OutVar(1)=mxCreateDoubleMatrix(m,n,0)!给返回参数分配内存808182 Call mxCopyReal8ToPtr(y,mxGetPr(OutVar(1)),m*n)!将返回参数赋值给分配的内存838485868788 DeAllocate(x,y)!释放临时分配的内存899091 Return929394 End SubRoutine9596979899 ! SubRoutine Add(x,y,z,m,n)100 !101 ! Integer,Intent(In)::m,n102 ! integer, parameter :: fp = selected_real_kind(15,300)103 !104 ! Real(fp),Intent(In)::x(m,n),z105 !106 ! Real(fp),Intent(Out)::y(m,n)107 !108 ! Integer i,j109 !110 ! Do i=1,m111 !112 ! Do j=1,n113 !114 ! y(i,j)=x(i,j)+z115 !116 ! EndDo117 !118 ! EndDo119 !120 ! Return121 !122 !End SubRoutine124 SubRoutine Add(x,y,z,m,n)125126127 Integer,Intent(In)::m,n128 integer, parameter :: fp = selected_real_kind(15,300)129130131 Real(fp),Intent(In)::x(m,n),z132133134 Real(fp),Intent(Out)::y(m,n)135136137 Integer i,j138139140 Do i=1,m141142143 Do j=1,n144145146 y(i,j)=x(i,j)+z147148149 EndDo150151152 EndDo153154155 Return156157158 End SubRoutine将matlab当前路径改为Add.f90同⽬录路径,然后: mex Add.f90 ,之后会⽣成Add.mex64在matlab命令⾏窗⼝输⼊:x=[1 2 3];a=2;y=Add(x,a)---我把Add.f90改为multiple.f90的话:效果⼀样。
MATLAB与C语言的异同

MATLAB与C语言的异同MATLAB是一种科学计算软件,也是当今最优秀的科技应用软件之一,专门以矩阵的形式处理数据。
它以强大的科学计算和可视化功能,简单易用、开放式可扩展环境,特别是所附带的三十多种面向不同领域的工具箱支持,使得它在许多科学领域成为计算机辅助设计和分析、算法研究和应用开发的基本工具和首选平台。
它作为一种计算工具和科技资源,可以扩大科学研究的范围,提高工程生产的效率,缩短开发周期,加快探索步伐,激发创作灵感。
作为一种计算机语言,一种用于科学工程计算的高效率的高级语言,MATLAB具有其他高级语言难以比拟的一些优点:编写简单、编程效率高、易学易懂。
与其他语言相比,MATLAB 的语法更简单,更贴近人的思维模式。
因此,MA TLAB语言也被通俗地称为“演算纸式”的科学计算语言。
在控制、通信、信号处理及科学计算等领域中,MA TLAB都被广泛地应用,已经被认可为能够有效提高工作效率、改善设计手段的工具软件。
而C语言是一种面向问题的程序设计语言,也是目前国际上流行的一种结构化的程序设计语言,语言处理程序采用的是编译程序。
它既有高级语言的特点,又具有汇编语言的特点。
它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。
因此,它的应用范围广泛,深受广大程序设计者的欢迎。
在操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它解释型高级语言,有一些大型应用软件也是用C语言编写的。
C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画。
同时,它也是是数值计算的高级语言。
C语言具有如下特点:1. 简洁紧凑、灵活方便C语言一共只有32个关键字,9种控制语句,程序书写自由,主要用小写字母表示。
它把高级语言的基本结构和语句与低级语言的实用性结合起来, C 语言可以象汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元。
FORTRAN学习中的一些小心得

FORTRAN 心得第一部分:一些小心得1Fortran不区分大小写2 Fortran有5种基本数据类型,integer,real, character, logical, complex3 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,STOPpause 暂停程序执行,按enter可继续执行continue 貌似没什么用处,可用作封装程序的标志STOP 命令用来结束程序,要谨慎使用10 数组元素之间要用逗号分隔,而不能像matlab一样既可以用逗号也可以用空格,fortran 的数组元素之间不能用空格。
matlab中数组元素引用

Matlab中数组元素引用有三种方法:1.下标法(subscripts)2.索引法(index)3.布尔法(Boolean)在使用这三种方法之前,大家头脑一定要清晰的记住,Matlab中数组元素是按列存储(与Fortran一样),比如说下面的二维数组A=8 1 63 5 74 9 2Matlab的存储顺序是8,3,4,1,5,9,6,7,2,也就是说先行后列,对于3维数组呢,就是先行后列再页对应个元素的索引和下标分别为Element Index Subscripts8 1 (1,1)3 2 (2,1)4 3 (3,1)1 4 (1,2)5 5 (2,2)9 6 (3,2)6 7 (1,3)7 8 (2,3)2 9 (3,3)从上面的例子中已经很清晰的说明了下标和索引的区别了,也就是说Matlab为没有个元素分配了一个唯一识别的ID(即index)1.下标法引用A(ii,jj):其中ii和jj可以是一维向量、标量、“:”号或者“end”大家对下标估计比较熟悉,由于在C语言中接触过,但是我这里需要强调的是,Matlab的下标是可以多行多列同时引用的,而像C语言等一次只能引用一个,比如A(2:3,3:-1:1)表示引用数组中的2~3行,3~1列对应的元素A(:,end)表示引用最后一列元素,“:”表示所有列或行,“end”表示最后一列或列,“en d-n”表示倒数第n行或列A(1,end-1)表示引用第1行倒数第2个元素A([2 1 3 3],[1 1 2 2 1])表示引用按两个向量引用指定的元素,即A中的第2,1,3,3行和第1,1,2,2,1列对应的元素>>A=magic(3)A =8 1 63 5 74 9 2>>A(2:3,3:-1:1)ans =7 5 32 9 4>>A(:,end)ans =672>>A(1,end-1)ans =1>>A([2 1 3 3],[1 1 2 2 1])ans =3 3 5 5 38 8 1 1 84 4 9 9 44 4 9 9 42.索引法引用(说白了索引就是存储顺序)A(index):index可以是任意的数组,index的元素必须是正整数,且不大于numel(A),返回的是一个尺寸与index一样的数组下标和索引之间可以通过ind2sub和sub2ind函数相互转换,具体可以看帮助,很简单[I,J] = ind2sub(siz,IND)IND = sub2ind(siz,I,J)还有使用A(:)就可以将数组A转换为列向量A(8):表示引用A的第8个元素B=A([1 10 5 2 2 1 3]):表示依次引用A的第1,10,5,2,2,1,3个元素,返回与index尺寸相同的数组,也就是说size(B)=size(index)A([2 5 9;1 1 1;8 5 6]):返回的时侯是一个3*3的矩阵>>A=magic(5)%括号中为索引值A =17 (1) 24 (6) 1 (11) 8 (16) 15 (21)23 (2) 5 (7) 7 (12) 14 (17) 16 (22)4 (3) 6 (8) 13 (13) 20 (18) 22 (23)10 (4) 12 (9) 19 (14) 21 (19) 3 (24)11 (5) 18 (10) 25 (15) 2 (20) 9 (25)>>A(8)ans =6>>A([1 10 5 2 2 1 3])ans =17 18 11 23 23 17 4>>A([2 5 9;1 1 1;8 5 6])ans =23 11 1217 17 176 11 243.布尔法引用A(X):X是一个有0和1组成布尔型数据,且size(A)=size(X),对应位置为1则留下该数据,0则去掉,最后按A中的存储顺序,返回一个列向量假如说A是3*3的数组A(logical([1 0 0;0 1 0;0 0 1])):表示引用了数组A的对角线元素,注意必须使用logical 将0/1数组转换为布尔型>>A=magic(3)%生成一个3*3的数组A=8 1 63 5 74 9 2>>x=logical([1 1 0;0 1 1;1 0 1])%将double转化为boolean型数据x =1 1 00 1 11 0 1>>A(x)%引用对应位置为1的数据,返回列向量ans =841572>>x=A>5%是有了比较语句,返回布尔型数据,对应位置数据大于5的为1,否则为0x =1 0 10 0 10 1 0>>A(x)%返回大于A中大于5的元素,其实该命令可以一次性执行A(A>5)或者find(A>5),前者返回具体元素,后者返回大于5的数据的索引值ans =8967>>A(A>5)%一次性执行上面的命令ans =8967>>indx=find(A>5)%查找A中对于5的元素,返回它们的索引(index)值,此时我们可以通过A(index)返回具体的元素index =1678增加内容1)直接输入:行向量:a=[1,2,3,4,5]列向量:a=[1;2;3;4;5]2)用“:”生成向量a=J:K生成的行向量是a=*J,J+1,…,K+a=J:D:K生成行向量a=*J,J+D,…,J+m*D+,m=fix((K-J)/D)3)函数linspace用来生成数据按等差形式排列的行向量x=linspace(X1,X2):在X1和X2间生成100个线性分布的数据,相邻的两个数据的差保持不变。
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 Li2brary) 动态链接库文件,该文件可在MATLAB 环境下,像命令函数一样直接运行和调用,使用起来极为方便. 采取MEX 文件方式,是重复利用已有FOR2TRAN、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”) ;elseif ( 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 dimen2sion. ”) ;/ 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 () 函数有大量语句是用于检查变量的数据类型等辅助性工作,这是必要的,因为MAT2LAB 语言不像C/ C + + 等语言变量使用前须声明,对类型的检查可以避免许多错误的发生.下面简要的说明一下上面程序中用到的MAT2LAB API 函数,它们在mex. h 或mat rix. h 中声明. mexFunction () ,入口子程序函数,其格式如下:void mexFunction(int nlhs ,mxArray 3 plhs[ ] ,intnrhs ,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 ,mxComplex2ity 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 ,zy = x + zreturnend! 以下是入口子程序subroutine mexFunction(nlhs ,plhs ,nrhs ,prhs) ! 参数声明integer nlhs ,nrhs ,plhs ( 3 ) ,prhs ( 3 )! 调用API 库函数的声明integer mxGet Pr ,mxCreateFullinteger mxGetM ,mxGetN ,mxIsNumeric! 程序内部使用变量的声明第26 卷第6 期陈建平等MATLAB 与C/ C + + 、FORTRAN 语言混合编程549 integer xpr ,ypr ,zprinteger mrows ,ncols ,sizereal 3 8 x ,y ,z! 检查输入输出变量个数if (nrhs. ne. 2) thencall mexErrMsgTxt (’Two input s arquired’)elseif (nlhs. gt . 1) thencall mexErrMsgTxt ( ’Too many output argu2ment s’)endif! 输入量必须是两个数mrows = mxGetM(prhs (1) )ncols = mxGetN(prhs (1) )size = mrows 3 ncolsif (mxIsNumeric (prhs (1) ) . eq. 0) thencall mexErrMsgTxt (’Input s must be a number’)endifmrows = mxGetM(prhs (2) )ncols = mxGetN(prhs (2) )size = mrows 3 ncolsif (mxIsNumeric (prhs (2) ) . eq. 0) thencall 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)! 调用计算功能子程序mypluscall myplus (y ,x ,z)! 将计算结果传给输出数据指针call mxCopyReal8ToPt r (y ,ypr ,size)returnend该程序的结构和内容与前面myplus. c 大致相同,也是由两部分:一个计算功能子例行程序和一个入口子例行程序构成,其程序中参数和变量大多相同,这里就不一一再介绍了. 但值得一提的是, FOR2TRAN 和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 . dllEXPORTS mexFunction(如果是FORTRAN 该行改为EXPORTS -MEXFUNCTION @16 )并加入定义文件myproject . def 到工程③定位库文件( . lib) 位置. 具体操作为:选择VC下拉菜单Tools/ Options ⋯,在弹出的对话框Show di2rectories 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/ Set2tings ⋯, 在弹出的对话框中选择C/ C + + 选项卡,在Category 栏中选择Preprocessor 选项,在出现的Pre2 processor definitions : 框中填入MATLAB-MEXFILE.⑤最后就是调试运行配置. 具体操作为:选择VC下拉菜单Project/ Settings ⋯,在弹出的对话框选择Debug 选项卡,在Category 栏中选择General 选项,在出现的Executable for debug session :框中填入C: \ MATLAB6p5 \ bin \ win32 \ matlab. exe.4. 2 在Visual Studio 中使用MATLAB add - inMATLAB6. 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 调用Fortran Dll数组传递范例

Matlab 调用Fortran Dll数组传递范例
1、Fortran代码
test.f90
SUBROUTINE add(outdata,indata)
!DEC$ ATTRIBUTES C,DLLEXPORT :: add
!伪注释说明test.dll文件中包含一个名为add的子例行程序,C即为按C 调用约定输出
IMPLICIT NONE
REAL outdata(2),indata(3)
outdata(1)=indata(1)-indata(3)
outdata(2)=indata(2)+indata(3)
ENDSUBROUTINE
2、.h代码
test.h
void add(float*, float*);
//该代码名须与子例行程序名相同,该头文件可在任何文件编辑器中编写,编写完后保存头文件,本例中头文件名为:test_c.h。
其实,每一个dll文件可包含多个子例行程序,那么在书写头文件代码时,就需要对应书写多个void代码。
3、Matlab代码
test.m
clc; clear all;
loadlibrary('test.dll','test.h');
x=[0,0];indata=[1,2,3];
outdata=calllib('test', 'add', x,indata);
%调用test.dll文件里的add子例行程序
%x虽然对应Fortran里的输出(指针),但它并不返回值
%outdata才是返回的值,输出在输入前面(如果仅输出一个数组的话)unloadlibrary test。
Fortran和Matlab混合编程简介

陆华剑 2003年7月23日
内容
一 Fortan和Matlab优缺点比较
二 Fortran和Matlab混合编程的两种基本方式 (1)Fortran和Matlab编程比较 (2)Fortran调用Matlab命令 (3)Matlab调用Fortran程序 三 参考资料
一 Fortan和Matlab优缺点比较
(从数值计算角度) 程序 优点 缺点 计算结果不能直 接可视化
Fortran
计算速度快
语言简洁,函数 丰富,调试容易, Matlab 计算结果可以方 便地实现可视化
计算速度慢
Fortran+Matlab
优点
.计算速度快 (Fortran) .计算结果可视化 (Matlab)
二Fortran和Matlab混合编程的两种基本方式 (1)Fortran和Matlab编程比较 (2)Fortran调用Matlab命令 (3)Matlab调用Fortran程序 三参考资料
三 参考资料
1)《Fortran95程序设计》 彭国伦 编著, 中国电力出版社 2)《matlab 5.x入门与提高》 龚剑 朱亮 编著,清华大学出版社 3)Matlab联机帮助文件
Fortran Engine Functions
integer*4 function engOpen(startcmd) integer*4 ep character*(*) startcmd integer*4 function engClose(ep) integer*4 ep integer*4 function engPutVariable(ep, mp) integer*4 ep, mp integer*4 function engGetVariable(ep, name) integer*4 ep character*(*) nam integer*4 function engEvalString(ep, command) integer*4 ep
Fortran和MATLAB:哪种更适合科学计算

Fortran和MATLAB:哪种更适合科学计算在科学计算领域,Fortran和MATLAB都被广泛应用。
然而,哪一个更适合科学计算呢?本文将分析Fortran和MATLAB在性能、语言特性、开发效率和应用领域等方面的差异,以帮助读者更好地选择适合自己的工具。
1.性能Fortran语言在科学计算领域应用非常广泛,其中一个重要原因是它的高性能。
Fortran是一种编译型语言,能够通过编译器优化来获得更高的执行效率。
Fortran语言的优化功能特别适合于数值计算和科学计算领域,这使得它在性能方面比大多数其他语言都要快。
相比之下,MATLAB的性能较为一般。
虽然MATLAB拥有丰富的库函数和易用的语法,但它主要是一种解释型语言。
这意味着MATLAB需要在运行时对代码进行解析和编译,因此它无法像Fortran那样进行编译器优化和静态类型检查。
由于这些原因,MATLAB的性能通常比Fortran差。
2.语言特性Fortran和MATLAB在语言特性方面也有很大的差异。
Fortran是一种面向过程的编程语言,通常用于数值计算和科学计算。
Fortran拥有强大的数组和矩阵操作功能,可以在循环结构和条件语句之间进行高效的转换。
Fortran的语法和结构非常简单,易于阅读和编写。
与Fortran不同,MATLAB是一种基于矩阵的编程语言。
它以矩阵为核心,在数组、向量和矩阵操作方面非常出色。
MATLAB的语法相对简单,适合于快速原型设计和开发。
3.开发效率在开发效率方面,MATLAB通常比Fortran更适合科学计算。
MATLAB的函数库拥有丰富的函数和工具箱,可以快速开发和测试算法。
MATLAB也提供了大量的可视化工具,使得数据可视化和分析变得更加容易。
相比之下,Fortran的开发效率较低。
Fortran需要编写大量的代码来实现科学计算算法,相对于MATLAB,它需要更长的开发时间和更高的技术难度。
同时,Fortran的调试过程也比较繁琐,需要更多的时间和精力。
matlab基本用法小结

Matlab基本用法小结一、说明................................ 错误!未定义书签。
二、数据类型及基本输入输出............... 错误!未定义书签。
1、数据类型,声明及赋初值............ 错误!未定义书签。
2、基本输入输出 ..................... 错误!未定义书签。
三、流程控制 ............................ 错误!未定义书签。
1、运算符 ........................... 错误!未定义书签。
2、IF ............................... 错误!未定义书签。
3、switch-case结构.................. 错误!未定义书签。
4、try-catch结构.................... 错误!未定义书签。
四、循环................................ 错误!未定义书签。
1、while ............................ 错误!未定义书签。
2、for .............................. 错误!未定义书签。
五、数组、数组运算和矩阵运算............. 错误!未定义书签。
1、数值数组 ........................ 错误!未定义书签。
2、数组运算和矩阵运算................ 错误!未定义书签。
3、逻辑数组 ......................... 错误!未定义书签。
4、字符串数组 ....................... 错误!未定义书签。
5、元胞数组 ......................... 错误!未定义书签。
6、构架数组 ......................... 错误!未定义书签。
matlab 代替 fortran goto语句

matlab 代替fortran goto语句摘要:1.MATLAB 简介2.MATLAB 与Fortran 的比较3.MATLAB 中实现GOTO 语句的方法4.示例:使用MATLAB 代替Fortran GOTO 语句正文:1.MATLAB 简介MATLAB(Matrix Laboratory)是一款广泛应用于科学计算、数据分析和可视化的编程语言。
它以矩阵计算为核心,提供了丰富的函数库和强大的数据处理能力,使得用户可以更加高效地完成各种计算任务。
2.MATLAB 与Fortran 的比较Fortran(Formula Translation)是一种历史悠久的编程语言,主要应用于数值计算和科学计算领域。
在过去,许多科研和工程项目都采用Fortran 进行编程,但随着计算机技术的发展,MATLAB 等新兴编程语言逐渐成为科研人员的首选。
与Fortran 相比,MATLAB 具有以下优势:(1)语法简洁:MATLAB 语法更加简洁易懂,降低了编程的难度。
(2)功能丰富:MATLAB 内置了丰富的函数库,用户可以直接调用,无需额外编写代码。
(3)数据处理能力强:MATLAB 具有强大的数据处理能力,可以方便地处理和分析大规模数据。
(4)可视化:MATLAB 提供了丰富的可视化工具,可以直观地展示数据和结果。
3.MATLAB 中实现GOTO 语句的方法在MATLAB 中,并没有直接对应的GOTO 语句,但可以通过其他方式实现类似的功能。
例如,我们可以使用`continue`和`break`语句来控制循环的执行流程。
(1)使用`continue`语句:当遇到`continue`语句时,循环将跳过当前迭代,直接进入下一轮迭代。
示例如下:```matlabfor i = 1:5if i == 3continue;enddisp(i);end```在上述代码中,当i 等于3 时,循环将跳过当前迭代,直接进入下一轮迭代。
MATLAB与其他编程语言对比与选择指南

MATLAB与其他编程语言对比与选择指南引言在计算机科学和工程领域,选择一种合适的编程语言对项目的开发和实施至关重要。
编程语言的选择往往涉及到项目的规模、复杂性以及所需的计算资源。
本文将重点讨论MATLAB与其他常见编程语言的比较和选择指南,以帮助读者了解何时适合使用MATLAB以及何时需要考虑其他编程语言。
一、MATLAB简介及特点MATLAB(Matrix Laboratory,矩阵实验室)是一种功能强大的科学计算和数据分析工具,可用于各种领域,包括数学、物理、生物学、工程学等等。
MATLAB的主要特点如下:1. 语法简洁易学:MATLAB的语法类似于数学语言,易于理解和学习。
它使用矩阵表示数据,使向量和矩阵操作变得简单直观。
2. 丰富的工具箱:MATLAB提供了大量的工具箱,可以帮助用户进行图像处理、信号处理、优化、控制系统设计等任务。
这些工具箱提供了许多预先编写好的函数和算法,方便用户快速完成各种任务。
3. 强大的可视化能力:MATLAB具有出色的绘图和可视化功能,可以轻松生成高质量的图形和图表。
这对于数据分析、模型验证和结果呈现非常有帮助。
4. 丰富的社区支持:MATLAB拥有庞大的用户社区,用户可以通过官方文档、在线教程和问答平台等途径获得帮助和支持。
二、MATLAB与其他编程语言的比较1. MATLAB vs PythonPython是一种通用目的的编程语言,与MATLAB相比,它具有以下优势:- 开源免费:Python是开源的,用户可以免费使用和分发。
相比之下,MATLAB是商业软件,需要购买和获得许可。
- 生态系统庞大:Python具有庞大的第三方库和扩展,涵盖了各种领域的应用。
这使得Python更适合于大规模项目和复杂的数据分析任务。
- 跨平台:Python支持多个操作系统,可以轻松在不同的平台上运行。
然而,MATLAB也有其独特的优势:- 面向科学计算:MATLAB专注于科学计算和工程领域,提供了许多针对特定任务的工具箱和函数。
matlab 代替 fortran goto语句

matlab 代替fortran goto语句
摘要:
1.引言
2.Matlab简介
3.Fortran中的goto语句
4.Matlab中替代goto语句的方法
5.总结
正文:
1.引言
Matlab是一种广泛应用于科学计算和数据分析的编程语言。
在某些场景下,Matlab可以替代Fortran语言,包括一些特定功能,如矩阵操作和图形绘制。
本文将探讨如何使用Matlab替代Fortran中的goto语句。
2.Matlab简介
Matlab是一种强大的数学软件,它具有丰富的函数库和良好的图形界面。
它支持多种编程结构,包括循环结构(如for循环和while循环)和条件结构(如if-else语句)。
3.Fortran中的goto语句
在Fortran中,goto语句是一种跳转指令,用于实现复杂的控制结构。
然而,过多的使用goto语句可能导致代码的可读性降低,甚至出现无限循环等问题。
4.Matlab中替代goto语句的方法
在Matlab中,可以通过以下方法替代goto语句:
a.使用条件结构(如if-else语句)来实现多路分支。
b.使用switch-case语句进行多路分支。
c.使用循环结构(如for循环和while循环)来实现复杂的控制逻辑。
d.使用Matlab的内置函数(如isequal、isless等)进行条件判断。
5.总结
总之,虽然Matlab可以替代Fortran中的goto语句,但在实际应用中,应尽量避免过多使用跳转语句,以提高代码的可读性和可维护性。
fortran程序两种循环读写数组结果比较分析

fortran程序两种循环读写数组结果⽐较分析1、现有数据⽂件:d:/cs3.txt,具体个数如下:1.5 0.9 -0.1 -0.3-0.9 -0.6 0.5 -0.20.3 -0.5 -0.2 0.20.7 -0.3 0.3 0.6-0.5 1.9 0.6 -0.12、编写fortran程序:!定义数组维数:m*n,数据也类似存放!读取时循环为先⾏后列读取,实质为按⾏读取⾜额数据后读下⼀⾏1)⾏列循环:((x(i,j),j=1,n),i=1,m)parameter(m=5,n=4)real x(m,n)OPEN(2,FILE='D:\model\cs3.TXT')READ(2,*)((x(i,j),j=1,n),i=1,m)write(*,100)((x(i,j),j=1,n),i=1,m)CLOSE(2)100 FORMAT(4F9.2)end此时 write(*,100)((x(i,j),j=1,n),i=1,m) 命令输出结果为:1.5 0.9 -0.1 -0.3-0.9 -0.6 0.5 -0.20.3 -0.5 -0.2 0.20.7 -0.3 0.3 0.6-0.5 1.9 0.6 -0.1表⽰x(m,n)元素与实际数据存放位置⼀致!下⾯将⾏列循环中显⽰程序调整为:write(*,100)(x(i,1),i=1,m)CLOSE(2)100 FORMAT(5F9.2)此时x(m,n)的第⼀列x(:,1)为:1.5 -0.9 0.3 0.7 -0.52)列⾏循环:((x(i,j),i=1,m),j=1,n)parameter(m=5,n=4)real x(m,n)OPEN(2,FILE='D:\model\cs3.TXT')READ(2,*)((x(i,j),i=1,m),j=1,n)write(*,100)((x(i,j),i=1,m),j=1,n)CLOSE(2)100 FORMAT(4F9.2)end此时write(*,100)((x(i,j),i=1,m),j=1,n) 输出结果为:1.5 0.9 -0.1 -0.3-0.9 -0.6 0.5 -0.20.3 -0.5 -0.2 0.20.7 -0.3 0.3 0.6-0.5 1.9 0.6 -0.1表明不管是先⾏还是先列,读取数据从write完全显⽰⾓度不会有差异;下⾯将列⾏循环中显⽰程序调整为:write(*,100)(x(i,1),i=1,m)CLOSE(2)100 FORMAT(5F9.2)此时x(m,n)的第⼀列x(:,1)为:1.5 0.9 -0.1 -0.3 -0.9⽐较第⼀列元素不难看出,按⾏列循环读取,数据对应元素与实际吻合,是我们实际应该采⽤的⽅式;3)读取部分数据,如⾏列循环程序调整如下:parameter(m=5,n=4)real x(m,n)OPEN(2,FILE='D:\model\cs3.TXT')READ(2,*)((x(i,j),j=1,2),i=1,m)write(*,100)((x(i,j),j=1,2),i=1,m)CLOSE(2)100 FORMAT(2F9.2)end则可以发现,读取的数据为按⾏读取到⾜够的数据后组成的矩阵,也就是不可以只读取其中某⼏列,即:1.5 0.9-0.1 -0.3-0.9 -0.60.5 -0.20.3 -0.5因此,分别从数据定义⾓度和数据存放⾓度选取不同处理⽅式:(1)若设数组x(m,n)表⽰m个站点n个观测,不同改变其含义,则依据实际存放数据的特点选择循环⽅式:1)实际数据存放也是按照⾏为不同站点,列为不同时间观测,则采⽤⾏列循环读取⽅式;2)实际数据存放是按照⾏为不同时间观测,列为不同站点,则采⽤列⾏循环读取⽅式;这样读取的数组x(m,n)才与实际的对应。
Matlab编程和其他语言的区别

Matlab编程和其他语言的区别一、字符和字符串在MATLAB中不管是字符,还是字符串都是用单引号。
而在C、C++、C#、Java等语言中,字符是用单引号的,字符串则必须用双引号。
因此在MATLAB中如果需要在字符串中用到单引号的话,就要用两个单引号来代替。
如:>> a='this''is an apple'a =this'is an apple同理,如果字符串中需要双引号的话,可以用四个单引号来代替。
如下:>> b='I''''am Tim'b =I''am Tim在MATLAB中的字符串连接,我们可以使用一对中括号。
当然,这种连接方式也适用于向量、矩阵等的连接。
如下:>> c=[a b]c =this'is an appleI''am Tim>> a1=[1 2];b1=[3 4];>> c1=[a1 b1]c1 =1 2 3 4>> c2=[a1;b1]c2 =1 23 4但是,对于字符串的连接不能使用加号(+)来进行。
这点和在C++、C#、Java等语言中是不一样的。
因为在MATLAB中这些字符串也是以矩阵的形式存储的,你要是用加号的话,需要两个矩阵的大小一致。
比如:>> a2='hello';b2='mustb';>> a2+b2ans =213 218 223 224 209但是,很明显,加完之后都是一系列的值了。
本来,这些字符串也是以数值的形式存储的。
而我们要取的字符串中某一个字符的时候,也是很方便的,直接像引用矩阵的元素一样。
如下:>> a2(1)ans =h>> a2(4)ans =l>> find(a2>'i')ans =3 4 5可以看到,a2里面在字母i后面的字符有第3、4、5个字符,也就是llo了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
航院 力 9 金鹏 2009011622 Fortran 与 matlab 均是数值计算中的有力的工具。前者以效率著称,后者以灵活出众。 二者在矩阵运算上很有特色, “matlab”更是矩阵实验室的简称。二者在矩阵运算上,自然 值得一比。 首先最简单的一个是生成随机矩阵并作矩阵乘法的速度对比。 Fortran 中: program cpr implicit none integer ,parameter::n=300 real(8) a(n,n),b(n,n),c(n,n) integer i,j real(8) t1,t2,t call cpu_time(t1) call ran_matrix(a) call ran_matrix(b) call cpu_time(t2) print*, t2-t1 c=matmul(a,b) call cpu_time(t2) print*, t2-t1 !print*, a contains subroutine ran_matrix(a) implicit none real(8) a(n,n) integer i,j real(8) r call random_seed() do i=1,n do j=1,n call random_number(r) a(i,j)=10000*r enddo enddo end subroutine ran_matrix end program 加上注释,共有 40 行。 运行结果如下图:
6];
c = [a;
b];
d = [a' b']
另外,对于等差情况还可以 X=(0:0.1:1)*pi %fortran 中的三元下标虽然跟这个有所区别,但是在使用是差不多 X=linspace(0,10,10) 又是需要取对数坐标的 X=logspace(0,2,11) 对于 linspace ,logspace 都有三个参数依次为起始数值,终了数值,和数据点个数。这 种功能在 Fortran 中似乎没有与相对应的方式。 MATLAB 的高维情况,也是直接赋值作为声明: >> b(3,3,3,3)=9 b(:,:,1,1) = 0 0 0 0 0 0 0 0 0
real x1,y1,z1 integer ::i,err=0 call cpu_time(time0) x=0; y=0; z=0.989876; open(1,file='graph.txt',form='formatted',status='replace') if(err) print*, 'wrong!' t=30000/m do i=1,m x1=x y1=y z1=z x=x1-t*(y1+z1) y=y1+t*x1+a*y1*t z=z1+(b+z1*(x1-c))*t write(1,*) x,y,z enddo close(1) call cpu_time(time1) print*, time1-time0 end
然后从引用或者寻址。Fortran 的引用可以有这样一些方式: A(n,m) A(:,n) A(1:3,m) A(2:ubound(a,1),n) !相应的 MATLAB 的语句为 a(2:end,n),之前几种用法基本一致 C=A(b) !即利用两个数组给第三个数组赋值,MATLAB 中亦有如此用法。 运算中,数组均可以作为参数: y=sin(x) 在数组中,个人觉得 MATLAB 比 Fortran 最大的特色在于它的缩维操作: A(2,:)=[] 当然,如果只置空了行或者列的某一部分时,无法缩维。 缩维操作给 MATLAB 的编程人员留下优化内存使用的空间,方便灵活,Fortran 里如果 想更灵活的运用内存,则恐怕只能向链表求助。另外更下策的办法如果让 Fortran 做同样的 事情,应该用可调大小数组通过 allocate 和 deallocate 的反复操作,而且应该还要一个足够 大的中间数组才能进行。对于追求效率的 Fortran 来讲,这是无法想象的。而 MATLAB 则以 这种灵活性。在避免数组使用的情况下计算相图轨线的坐标时, Fortran: program graph implicit none real time0,time1 integer,parameter::m=35000 real ,parameter ::a=0.25 real ,parameter ::b=1 real ,parameter ::c=3 real t,gap real x,y,z
一、赋值操作 在一般的语言中, 对数组的操作都会有对具体元素的操作, 所以其他的操作方式才跟值 得一比。 在 Fortran 语言中,要使用变量要首先进行声明,矩阵亦即多维数组更不例外。声明方 式有: real(4) d(3:1, 2:7) integer a(3,5) dimension:: e(10), f(2,3) 而在 MATLAB 中,无须声明,直接使用即可。 Fortran 赋初值技巧: real(4):: b(2,2) = (/1.0, 2.0, 0.0, 4.0/) data b /1.0, 2.0, 0.0, 4.0/ data i /-1/, f /1, 2, 2 * 0, 3, 4/ data a /1:5/ data a(1:3) /3 * 1/ data a(1:4) /3 * -1, 2/ 以上方法均在声明阶段进行。 此外还有条件赋值,十分方便: Where(i>j) a(I,j)=2 Elsewhere(i==j) a(I,j)=1 End where Forall(a>0) a=0 相应的,对于 MATLAB,可以有逻辑寻址对应 Fortran 中的相应功能: x(abs(x)>1) %返回数组 x 中绝对是大于 1 的元素组成的一维数组。abs(x)>1 则返回一个逻辑数组 另外,Fortran 的 merge 函数也可实现类似的功能,只是相比之下写起来十分罗嗦。当 然如果使用操作符重载,可以简化书写,但是可移植性会比较差,而且增加了编程的复杂程 度,为了简化的复杂化,有点得不偿失。 对于数字整体操作,在实现同样的功能的时候, Fortran 利用了并行处理的能力,而 MATLAB 却要多消耗掉形状相同的数组那么大的内存资源, MATLAB 其灵活性让人一目了然, Fortran 的高效性则在代码背后隐藏着: Integer a(5) a=1 a=[1:5] a=[5:1:-1] c(2:5) = c(1:4) %此时是整体操作,引入不必担心先赋值的影响到后边的数着 对于 Fortran 和 MATLAB,均可以进行整体赋值:对于矩阵 A,将所有元素置为 3 的语句
生成了一个 1.56M 的文本格式数据文件。不过方程组的答案趋于无穷,文件中的数值 没迭代几次就都是无穷了,显示为 NaN。 MATLAB: tic; m=35000; figure(3) t=linspace(0,30000,m); g=30000/m;
cumsum %累计元素总和 cumprod %累计元素总乘积 dot cross 对于某一些特殊的矩阵,MATLAB 自带函数进行赋值,例如: ones(m,n) eye(m,n) magic(m) rand(m,n) randn(m,n) pascal(n) cat(k,a,b ) %用于合并矩阵,也算在赋值了 vander(m,n) hilb(n) 一些操作:
flipud %上下翻转 fliplr &左右翻转 rot %旋转矩阵 自带的丰富的函数,节约了大量的编程的时间。 对于异质数组 cell 数组,不展开了。 二、查询数组形状及对数组元素的引用 对于矩阵的操作应该说 Fortran 与 MATLAB 各有各的精彩。当然,就方便而言,从我的 了解来看应该还是 MATLAB 更胜一筹。方法之多样,方式之灵活,MATLAB 简直让我眼花缭 乱。 首先对比关于数组一些信息的获取: Fortran 数组上(下)界 形状 元素个数 占用内存大小 ubound(a)(lbound(a)) Shape(a) Size(a) Sizeof(a) whos MATLAB lendth
b(:,:,2,1) = 0 0 0 0 0 0 0 0 0
b(:,:,3,1) = 0 0 0 0 0 0 0 0 0
b(:,:,1,2) = 0 0 0 0 0 0 0 0 0
b(:,:,2,2) = 0 0 0 0 0 0 0 0 0
b(:,:,3,2) = 0 0 0 0 0 0 0 0 0
!用数组构造器赋值
! 按列存储, *表示重复
为: Fortran 中 A=3 A(1:3,1:3)=3 MATLAB 中 A(1:3,1:3)=3 其他情况, a = [1 2 3; 4 5 a = [1 2 3 4 5 6]
6]
或者可以利用其他量赋值: a = [1 2 3]; b = [4 5
a(1,1,1,1,2,2,2,2,2,2,1,2)=1 %若没有写上=1 则会出现错误。 的时候,竟然也没有出现错误提示,大量的篇幅用来显示同样的语句 a(:,:,1,1,2,2,2,2,2,2,2,2) = 0 当然这只是在数组中只有很少的元素(1~3 个)的情况下。用这么高的维数做运算明显 不是明智的。这种情况下,数组应与稀疏矩阵的优化有所联系,因此 MATLAB 可以胜任。我 也没有查到一个确切的维数的限制,但是至少知道数组大小的由内存所决定了。可以用 memory 查询一下: >> memory Maximum possible array: 752 MB (7.890e+008 bytes) * Memory available for all arrays: 1496 MB (1.569e+009 bytes) ** Memory used by MATLAB: 290 MB (3.038e+008 bytes) Physical Memory (RAM): 1908 MB (2.001e+009 bytes) * Limited by contiguous virtual address space available. ** Limited by virtual address space available. 一些已经有的向量的运算 min max mean median std diff sort sum prod %中位数 %标准差 %相邻元素差 %排序,而且返回索引