关于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、关于计算:乘方^改为**。要得到实数运算结果时注意给数字刻意加上小数点,如1.0/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加以辨别。还需强调一点,对于子程序的调用,参数最好采取已声明好的变量形式,而不是直接赋值(尤其对于real*8的参数),否则传入参数可能会出现错误。
6、关于文件输入输出:status用‘old’表示旧文件已存在,用‘replace’表示若文件不存在则创建若存在则覆盖。action用‘readwrite’表示又写又读(若有一项未编译到会警告,但不影响运行),position用‘append’表示从文件最后开始操作。
7、关于FORTRAN与MATLAB的接口:ep = engOpen("")打开MATLAB引擎。X = mxCreateDoubleMatrix(A, B, 0)创建双精度A*B数组X。call mxCopyReal8toPtr(array, mxGetPr(X), A*B)给新创建的数组赋值(其中mxGetPr用以返回数组的实部)。status = engPutVariable(ep, "X", X)将新创建数组植入MATLAB引擎。status = engEvalString(ep, "")向MATLAB传达命令。call mxDestroyArray(Qq)销毁创建数组。status = engClose(ep)关闭引擎。需要注意一点,诸如ep,X这些变量需在程序中加以整型变量声明,但存储的实际上是32位指针地址,此外,若要将整数传入MATLAB,则需先在FORTRAN中声明一real*8变量并以此为桥才可将整数传入MATLAB。
8、补充,MATLAB中如何自动输出图片:str1='D:\';str=[str1 num2str(frames) '.jpg'];saveas(gcf,str);
matlab2011版本刚出的一个功能就是用coder将matlab的M代码转化为C代码,至于转化为fortran代码的功能应该还在开发中吧,具体的可以去matlab技术论坛问一下http://www.matlabsky.com/
手动转换吧,但有些地方是调用matlab底层函数的,没法转