关于MATLAB转FORTRAN的几点注意
1、关于主程序:需加implicit none,变量需定义,其他规则同一般程序,句末分号记得去掉。此处再着重提及一下变量声明,常量加parameter不用说,普通变量根据要求选择,外部子程序必要是需加interface(参数包含数组等情况),外部函数一定需加变量说明并指出external(这一点其实不写不会有语法错误,但为避免混乱,最好加上),后面要用到的与MATLAB进行接口的函数也同样需声明。
2、关于循环:for变为do,end改为end do。while改为do while。
3、关于分支:if后需加then,判断语句外加括号,end改为end if。判断等于都是用==,不变。不等于~=改为<>。逻辑和&&改为and,逻辑或||改为or。
4、关于计算:乘方^改为。要得到实数运算结果时注意给数字刻意加上小数点,如10/3,否则1/3将默认为整除使结果为0。cos、sin和asin、acos在MATLAB与FORTRAN中都有,但MATLAB中有tan与cot,而FORTRAN中只有tan。总之,大量MATLAB中直接自带的计算函数FORTRAN中要么自己编,要么利用外部库函数。
5、关于产生随机数:MATLAB自带各种随机数,FORTRAN中需先用call random_seed()声明,然后由call random_number(X)获得0~1之间均匀分布的随机数X,再利用函数得到想用的随机数。
5、关于外部子程序:子程序通过call实现,与MATLAB直接调用不一样。FORTRAN的subroutine中的参数既可以是传入的,也可以是传出的,或两者兼有。为避免犯错,可在子程序内声明时用intrinsic和external加以辨别。还需强调一点,对于子程序的调用,参数最好采取已声明好的变量形式,而不是直接赋值(尤其对于real8的参数),否则传入参数可能会出现错误。
6、关于文件输入输出:status用‘old’表示旧文件已存在,用‘replace’表示若文件不存在则创建若存在则覆盖。action用‘readwrite’表示又写又读(若有一项未编译到会警告,但不影响运行),position用‘append’表示从文件最后开始操作。
7、关于FORTRAN与MATLAB的接口:ep = engOpen("")打开MATLAB引擎。X = mxCreateDoubleMatrix(A, B, 0)创建双精度AB数组X。call mxCopyReal8toPtr(array, mxGetPr(X), AB)给新创建的数组赋值(其中mxGetPr用以返回数组的实部)。status = engPutVariable(ep, "X", X)将新创建数组植入MATLAB引擎。status = engEvalString(ep, "")向MATLAB传达命令。call mxDestroyArray(Qq)销毁创建数组。status = engClose(ep)关闭引擎。需要注意一点,诸如ep,X这些变量需在程序中加以整型变量声明,但存储的实际上是32位指针地址,此外,若要将整数传入MATLAB,则需先在FORTRAN中声明一real8变量并以此为桥才可将整数传入MATLAB。
8、补充,MATLAB中如何自动输出:str1='D:\';str=[str1 num2str(frames) 'jpg'];saveas(gcf,str);
看起来是什么专业性的求值,没有太难的句子,你耐下心读一读就好。
以下是我大体看了一遍的理解:
common 是公共块,让主程序和子程序共享数据。
data 给变量赋初值,把前面的一串变量分别赋成后面的数值。
提前打开dat文件。
从屏幕读入一个值kg。
做一个判断。
分别调用三个子程序,结束主程序。
output子程序:
主要是求值,做判断,把结果写入之前打开的dat中。
subh子程序:
求值。
subp子程序:
除了一个goto之外都是普通的求值,goto其实也很好理解。
我不知道变量名代表什么,所以看起来只是一堆求值;对你来说这些变量都是有意义的,才能看出是想干嘛。
你已的编译器已经能够完全正常运行,而且程序也可以运行了呢,只是你不知道如何运行它而已!
在unix或linux下编译fortran,一般系统没有自带fortran的编译器,可以自行安装g77或gfortran编译器,它们是gcc一个系列的,也可以下载单独的g95编译器。
假定你的fortran源程序为hellofor
则输入如下的命令来编译它(g77、gfortran、g95)
g77 hellofor
这样就会在当前目录生成aout的可执行文件,这样既可执行
/aout
如果需要指定生成的文件名,可以加个参数-o 来制定文件名,像这样
g77 -o hello hellofor
/hello
明白了吗?unix类操作系统的执行档,并不需要exe这样的扩展名的。
Fortran 语言发展简史:
Fortran是世界上第一个计算机高级语言,由约翰·巴克斯开发,1956年开始使用,而C语言,1972年诞生,python,1991年诞生,Java,1995年,可以说后期的语言基本上都有借鉴Fortran的地方,最早的matlab版本也是用Fortran代码写的。Fortran是所有科学计算语言的祖先,该语言的设计之初就是为了将科学计算公式转换为计算机代码。第一版的FORTRAN是由IBM于1954-1957年为它的704计算机开发的。
1958年,IBM发布FORTRAN II 。
1962年,发布FORTRAN IV 。
1966年, FORTRAN IV 被ANSI 标准采纳,成为了众所周知的FORTRAN 66。
1977年,FORTRAN77诞生。
1992年,Fortran90诞生,这是Fortran里程碑的进步,最重要的是它支持自由格式了。
1996年,Fortran95诞生,这只是Fortran90基础上很小的修改。
2004年,Fortran 2003 诞生 ,它增加了面向对象编程。
Fortran2003 之后的下一个版本是Fortran 2008,也只是很小的更新。
Fortran 特点:
Fortran语言的最大特性是接近数学公式的自然描述,在计算机里具有很高的执行效率。易学,语法严谨。可以直接对矩阵和复数进行运算,这一点类似MATLAB。自诞生以来广泛地应用于数值计算领域,积累了大量高效而可靠的源程序。很多专用的大型数值运算计算机针对Fortran做了优化,广泛地应用于并行计算和高性能计算领域。Fortran 90,Fortran 95,Fortran 2003的相继推出使Fortran语言具备了现代高级编程语言的一些特性。
代码例子:
一个递归代码的例子。在1到25中选取五个数,其和值等于100,有多少种方案?
答案是84种。
如果你有源代码文件,用记事本打开既可查看。或者用其他任意文本编辑器,比如写字板,word,UltraEdit。
如果你没有源代码文件,而只有 exe,那就别想了。编译型语言完全反编译几乎是不可能的。否则全球程序员就全部下岗了,毫无商业性可言。
这就意味着99%的软件都成为开源软件。
是的,这听起来就是理想社会。
以fortran代码为例:
~~~~~~~~~~~~~~~~~~~~
b=-1
do i=1,100
a=i
b=b+3
s=s+a/b
end do
write(,'(/a,f52)') 'S = ',s
end
~~~~~~~~~~~~~~~~~~~~~
输出为:
S = 3399
欢迎分享,转载请注明来源:表白网
评论列表(0条)