我正在尝试将Fortran中的一种雨水循环计数算法转换成Matlab,这是我不熟悉的一种语言。
有一个现成的Rainflow,我已经下载了Matlab,但这不符合我的项目的要求,所以我试图从零开始构建一个。
以下是Fortran代码:
INTEGER BUFFER (4096), INDEX, VALUE, RANGE, MEAN, X, Y
INDEX = 0
10 CONTINUE
call 'get next peak/valley', VALUE
INDEX = INDEX + 1
BUFFER (INDEX) = VALUE
20 CONTINUE
IF (INDEX.LT.3) THEN
not enough points to form a cycle
GOTO 10
ELSE
X = ABS (BUFFER(INDEX) - BUFFER(INDEX - 1))
Y = ABS (BUFFER(INDEX - 1) - BUFFER(INDEX - 2))
IF (X.GE.Y) THEN
c -- cycle has been closed
RANGE = Y
MEAN = (BUFFER(INDEX-1) + BUFFER(INDEX-2))/2
c -- remove the cycle
INDEX = INDEX - 2
BUFFER(INDEX) = BUFFER(INDEX+2)
c -- see if this value closes any more cycles
GOTO 20
ELSE
GOTO 10
END IF
END IF
我已经下载了f2matlab ( Fortran到Matlab转换器),但是它需要一个我没有的Fortran编译器。
我不太明白该如何转换的部分是:
call 'get next…
行(这是一个输入()吗?)BUFFER(4096)
等(在matlab中做一个矩阵是否有点大?)GOTO/CONTINUE
结构。他们是什么意思,在英语(或Matlab)?
我见过How to translate fortran goto state to matlab和translating loop from Fortran to MATLAB,但他们对我帮助不大。
发布于 2014-08-21 09:57:10
这
call 'get next peak/valley', VALUE
并不是(目前)语法上有效的Fortran,我也不确定以前的编译器是否也会理解它。我猜这意味着获取一个VALUE
,以便在下面的代码中使用。
INTEGER BUFFER (4096)
是一个简单的声明,说明BUFFER
是4096
整数的向量,在数据量中没有什么可吓到Matlab的。
最后,GOTO
是一个无条件的跳转,后面的数字是要跳转到的行的标签,所以GOTO 10
意味着下一步用label 10执行行。在您所展示的年份的FORTRAN中,非常常见的是跳转到CONTINUE
语句,在这种情况下,这是一个非操作,执行将继续到下一行。
在另一个上下文中,使用DO
循环,CONTINUE
将标记循环范围内的代码块的结束,并将产生微妙的不同效果。
https://stackoverflow.com/questions/25422719
复制相似问题