簡體   English   中英

將循環從Fortran轉換為MATLAB

[英]translating loop from Fortran to MATLAB

我目前正在手動將代碼從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

您可以包裝代碼的前半部分,直到在while循環中goto 120之后。 然后,當滿足條件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應該對程序流程做什么(除了難以遵循)。

到現在為止應該清楚的是,Matlab不包括“ goto”命令的任何變體。 Matlab的核心命令集似乎是圍繞“結構化編程”的原理設計的。 (如果我正確地記得我的CS古代歷史,那是在面向對象編程之前的一場激烈的辯論。)Wikipedia 對結構化編程進行了不錯的討論

在結構化編程出現之前的黑暗日子里,人們曾經對流程圖感到非常興奮,因為這是使用許多goto語句(現在通常稱為意大利面條式代碼)來可視化和理解一段代碼的最簡單方法之一。

我懷疑您將需要對整個子例程進行流程圖處理,然后確定哪種控制流構造最適合用來重新創建代碼。 如果它是一個相對簡單的圖,那么您可以使用if語句或case語句重新創建整個代碼,盡管一系列小的輔助函數可能更優雅。 如果結構更復雜,則翻譯可能需要更多的創造力。

通過使用while / break / continue構造,幾乎可以將Fortran中所有允許的goto轉換為MATLAB。 我編寫了一個(未發布的)程序來自動從Fortran代碼中刪除goto ,然后使用我的程序f2matlab將代碼轉換為MATLAB / Octave。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM