我正在尝试将Fortran中的Rainflow循环计数算法转换为Matlab,这是一种我不熟悉的语言。
我已经为Matlab下载了现成的Rainflow,但这不符合我项目的要求,所以我试图从头开始构建一个。
这是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 但他们对我没有帮助。
答案 0 :(得分:1)
此
call 'get next peak/valley', VALUE
不是(当前)语法上有效的Fortran,我不确定昔日的任何编译器是否也会理解它。我想这意味着在以下代码中使用VALUE
。
INTEGER BUFFER (4096)
是一个简单的声明,BUFFER
是4096
整数的向量,没有什么可以在该数据量中吓唬Matlab。
最后,GOTO
是无条件跳转,其后面的数字是要跳转到的行的标签,因此GOTO 10
表示执行下一个标签为10的行 。你在向我们展示的CONTINUE
语句跳转到DO
语句是很常见的,在这种情况下,这是一个无操作,执行继续到下一行。
在另一个上下文中,CONTINUE
循环{{1}}会在循环范围内标记代码块的结尾,并会产生微妙的不同效果。