Перейти к заявлениям - Фортран в Matlab - PullRequest
0 голосов
/ 08 апреля 2019

Я очень старался преобразовать этот код поиска по сетке из Fortran в Matlab, однако я не могу правильно включить операторы GO TO (я пытаюсь использовать циклы while, но думаю, что мне нужно что-то еще для их завершенияПоиск).Любая помощь будет принята с благодарностью.

vmax    = -1.0E+15           
amax_G  = -1

askipR  = REAL(ac_max - ac_min)/REAL(intA)

askip   = CEILING(askipR)


DO acc0 = 1,intA+1  

acc = ac_min + askipR * (acc0-1)  

    cons = ( x1 - grida2(acc) ) / onetauc

    IF (cons<0.0) GOTO 102

    vtemp = utilR(cons) + one_sv * utilB(acc)

    IF (vtemp>vmax) THEN      
        vmax = vtemp
        amax_G = acc
    ELSE
        GOTO 102
    ENDIF

ENDDO ! acc0


102 continue

IF (askip<2) GO TO 109

askip = askip/2

IF (amax_G>ac_min) THEN  

    acc = amax_G - askip
    cons = ( x1 - grida2(acc) ) / onetauc

    IF (cons<0.0) PRINT *,'WARNING: NEGATIVE CONS @ ASEARCH_Rx'

    vtemp = utilR(cons) + one_sv * utilB(acc)

    IF (vtemp>vmax) THEN
        vmax   = vtemp
        amax_G = acc
        GOTO 102
    ENDIF

ENDIF 


IF (amax_G < ac_max) THEN  

    acc  = amax_G + askip
    cons = ( x1 - grida2(acc) ) / onetauc

    IF (cons<0.0) GO TO 102

    vtemp = utilR(cons) + one_sv * utilB(acc)

    IF (vtemp>vmax) THEN
        vmax = vtemp
        amax_G = acc
    ENDIF

ENDIF 

GOTO 102

109 CONTINUE

vfunR(jc,ac,sc)   = vmax    ! jc=Nj

afunR_G(jc,ac,sc) = amax_G  ! jc=Nj

1 Ответ

0 голосов
/ 08 апреля 2019

В вашем выражении GOTO реализовано два типа потока управления:

Тип 1: разрыв цикла

Оператор GOTO используется для выхода из цикла DO:

    DO acc0 = 1,intA+1  
        ! some code
        IF (cons<0.0) GOTO 102
        ! some more code
    END DO
102 continue

Как вы заметили, если cons < 0.0, оператор GOTO сообщает о перемещении на метку 102, которая находится за пределами цикла DO. В Matlab есть не что иное, как простой break в цикле for:

for acc0=1:intA+1
  % some matlab code
  if (cons < 0.0)
    break
  end
  % some more matlab code
end

Тип 2: создание цикла

Хотя цикл явно не написан, следующий код создает что-то, что можно перевести как цикл while:

    ! This is the start of the loop
102 continue
    ! This is the condition to exit the loop <<==
    IF (askip<2) GO TO 109
    ! stuff
    ! This is a condition to restart the loop    <<==
    IF (vtemp>vmax) THEN
         vmax   = vtemp
         amax_G = acc
         GOTO 102
    ENDIF
    ! stuff
    ! This is another condition to restart the loop   <<==
    IF (cons<0.0) GO TO 102
    ! stuff
    ! This is the end of the loop, asked to restart it  <<==
    GOTO 102
    ! This is outside of the loop
109 CONTINUE

В конце концов, вы переводите это как:

while (askip >=2)
   % stuff
   if (vtemp > vmax)
        vmax = vtemp
        amax_G = acc
        continue
   end
   % stuff
   if (cons < 0.0)
      continue
   end
   % stuff
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...