0

我目前正在手动将代码从 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 时,代码将再次运行。谢谢!

编辑:作为对 Chris 关于标签 150 和 900 做什么的问题的回应,我将在此处发布它们。

150        t=marker
           min=x(t)

这是针对标签 900 的。

C  Last observation found.  This iteration finished.
900        continue
4

3 回答 3

0

您可以包装代码的前半部分,直到goto 120循环while之后。然后,您可以在满足条件时跳出此 while 循环if(x(t) .lt. neckext)。例如,逻辑可能如下所示。请注意,我没有尝试将其全部转换为 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应该做什么(除了难以理解之外)。

于 2012-09-04T13:13:58.147 回答
0

现在应该清楚了,Matlab 不包含“goto”命令的任何变体。核心 Matlab 命令集似乎是围绕“结构化编程”理念设计的。(如果我没记错我的 CS 古代历史,那是面向对象编程之前的一场大辩论。)维基百科对结构化编程有很好的讨论

在结构化编程之前的黑暗日子里,人们曾经对流程图非常兴奋,因为这是使用大量goto语句(现在通常称为意大利面条代码)可视化和理解一段代码的最简单方法之一。

我怀疑您将需要绘制整个子例程的流程图,然后决定哪些控制流构造最适合用于重新创建您的代码。如果是比较简单的图,那么你应该可以用if语句或case语句重新创建整个代码,虽然一系列的小辅助函数可能更优雅。如果它的结构更复杂,那么翻译可能需要更多的创造力。

于 2012-09-04T18:23:00.783 回答
0

Fortran 中几乎所有允许goto的 ' 都可以通过使用 // 构造转换while为MATLAB breakcontinue我编写了一个(未发布的)程序来自动goto从 Fortran 代码中删除 's,然后我使用我的程序 f2matlab 将代码转换为 MATLAB/Octave。

于 2012-09-04T23:40:14.607 回答