我目前正在手动将代码从Fortran转换为MATLAB,我不确定如何翻译它的一部分。 (整个代码实际上是一个2,000行的子程序。)代码如下。
C Has series crossed neckline?
120 neckext=x(trough(peaknum-1))+
* dydx*real((t-trough(peaknum-1)))
if(x(t).lt.neckext) goto 130
C NO. Here if series has not crossed neckline, nor new trough found
C Check to see if new trough has been found.
t=t+1
if(t.ge.lastobs) goto 900
if(x(t).lt.min) then
min=x(t)
mindate=t
end if
troughid=min*(1.0+cutoff)
if(x(t).ge.troughid) goto 150
goto 120
C YES. Here if series crossed neckline before new trough found
130 dblcount=0
if(poscount.ge.1) then
DO 132 i=1,poscount
if((enterdt(i)-2.le.t).and.(t.le.enterdt(i)+2)) then
dblcount=dblcount+1
end if
132 continue
if(dblcount.ge.1) then
C write(30,2583) t,Cutnum
2583 format('DoubleCounting episode occurred at ',I5,
* ' with Cutoff = ',F3.1)
goto 150
end if
end if
我的问题在于这部分代码:
if(x(t).ge.troughid) goto 150
goto 120
当我在MATLAB中翻译这部分时,我写的是:
if x(t,:)>=troughid
t=marker;
minimum=x(t,:);
end
但是我不知道如何处理标签120.当我翻译它时,我会再次写这个部分吗?因为根据我的理解,当我回到120时,代码将再次运行。谢谢!
编辑:作为克里斯关于150和900标签的问题的回复,我会在这里发布。
150 t=marker
min=x(t)
这是标签900。
C Last observation found. This iteration finished.
900 continue
答案 0 :(得分:0)
您可以打包代码的前半部分,直到goto 120
循环中的while
之后。然后,当满足条件if(x(t) .lt. neckext)
时,您可以在while循环中中断。例如,逻辑可能类似于以下内容。请注意,我还没有尝试将它全部转换为MATLAB(这是你的工作!!)但希望它能让你开始。
% Has series crossed neckline?
neckext = x(trough(peaknum-1)) + dydx*real((t-trough(peaknum-1)));
if (x(t) < neckext)
% Code below `goto 120` here...
else
while (x(t) >= neckext)
% Code above `goto 120` here...
end
end
% `goto 150` code here?
我不太确定上面是否是你需要的,因为没有完整的代码我不知道goto 150
和goto 900
应该对程序流做什么(除了制作很难遵循)。
答案 1 :(得分:0)
现在应该很清楚,Matlab不包含任何&#34; goto&#34;的变体。命令。核心Matlab命令集似乎是围绕&#34;结构化编程设计的。哲学。 (如果我记得我的CS历史正确,那就是面向对象编程之前的争论。)维基百科有一个不错的discussion of structured programming。
在结构化编程之前的黑暗时期,人们过去常常对流程图感到兴奋,因为这是使用大量goto
语句可视化和理解一段代码的最简单方法之一(现在通常被称为意大利面条代码)。
我怀疑您需要对整个子例程进行流程图,然后决定哪种控制流构造最好用于重新创建代码。如果它是一个相对简单的图表,那么您应该能够使用if
语句或case
语句重新创建整个代码,尽管一系列小帮助函数可能更优雅。如果它有一个更复杂的结构,那么翻译可能需要更多的创造力。
答案 2 :(得分:0)
使用goto
/ while
/ break
结构,Fortran中几乎所有允许的continue
都可以转换为MATLAB。我编写了一个(未发布的)程序来自动从Fortran代码中删除goto
,然后使用我的程序f2matlab将代码转换为MATLAB / Octave。