将循环从Fortran转换为MATLAB

时间:2012-09-04 12:54:48

标签: matlab loops fortran

我目前正在手动将代码从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

3 个答案:

答案 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 150goto 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。