[英]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 150
和goto 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.