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に戻ると、コードは再び実行されます。ありがとう!

編集:ラベル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構造化プログラミングの前の暗い時代には、フローチャートは多くのステートメント(現在は通常スパゲッティコードと呼ばれています)を使用してコードの一部を視覚化して理解する最も簡単な方法の1つであったため、人々はフローチャートに非常に興奮していました。

サブルーチン全体のフローチャートを作成してから、コードを再作成するためにどの制御フロー構造を使用するのが最適かを判断する必要があると思います。if比較的単純な図の場合は、ステートメントまたはステートメントを使用してコード全体を再作成できるはずですcaseが、一連の小さなヘルパー関数の方が洗練されている場合があります。より複雑な構造の場合、翻訳にはもう少し創造性が必要になる場合があります。

于 2012-09-04T18:23:00.783 に答える
0

Fortranで許可されているほとんどすべての'は、//構文gotoを使用してMATLABに変換できます。私はFortranコードからを自動的に削除する(リリースされていない)プログラムを作成し、次にプログラムf2matlabを使用してコードをMATLAB/Octaveに変換します。whilebreakcontinuegoto

于 2012-09-04T23:40:14.607 に答える