Подразумеваемые циклы do в Fortran

Как сделать то же самое с подразумеваемыми циклами do? Я хочу заменить существующий цикл для Vcvo и Vcvonew двумя подразумеваемыми циклами do?

Это мой код:

Program DO_LOOPS

Implicit none

Integer::i,j
Integer,parameter::BrCv=15,BrSat=24

Real,dimension(0:BrCv-1,BrSat)::Vcvo
Real,dimension(BrCv-1,BrSat)::Vcvonew

Do i=0,BrCv-1
   do j=1,BrSat

Vcvo(i,j)=i+j*BrCv/BrSat

 end do
End do

Do i=1,BrCv-1
   do j=1,BrSat


   Vcvonew(i,j)=Vcvo(i,j)

   end do
End do

Stop
End program DO_LOOPS

person Community    schedule 22.09.2015    source источник
comment
Вы хотите, чтобы i+j*BrCv/BrSat было целочисленным выражением?   -  person francescalus    schedule 23.09.2015
comment
Повторяя комментарий @Ross, что вас действительно волнует? Можно было бы очень легко использовать подразумеваемый-do в конструкторе массива для vcvo (и это так просто, я не уверен, что понимаю вопрос), но кроме как сделать пять строк на одну менее интуитивно понятную строку, я не знаю, почему подразумеваемый - делать то, что вы заботитесь о.   -  person francescalus    schedule 23.09.2015
comment
Мне нужно предложение для Vcvonew. Как заменить мое решение для циклов do двойными подразумеваемыми циклами do, например, я пытаюсь использовать это решение, но это неверно: ((Vcvonew(i,j),j=1,BrSat),i =1,BrCv-1)   -  person    schedule 23.09.2015
comment
Зачем вам нужно решение подразумеваемого действия, а не конструкции do, которые у вас есть, или даже vcvonew=vcvo(1:,:)? Просто для меня не очевидно, что ответ первого типа действительно будет таким, каким вы его себе представляете.   -  person francescalus    schedule 23.09.2015
comment
FORALL может быть здесь более разумным.   -  person Jeff Hammond    schedule 23.09.2015


Ответы (1)


Подразумеваемый цикл do будет таким:

Vcvo = reshape([((i + j*real(BrCv)/real(Brsat), i=0,BrCv-1), j=1,Brsat)],[BrCv,BrSat])

для первого.

Для второго вам не нужен подразумеваемый цикл. Простое назначение массива, как уже предлагалось, подойдет:

Vcvonew = vcvo(1:,:)

Первый не выглядит яснее, чем явный цикл. Но если вам нужно более компактное решение, вы можете использовать do concurrent:

do concurrent (i = 0:BrCv-1, j=1:Brsat)
    Vcvo(i,j) = i + j*real(BrCv)/real(Brsat)
end do

Вы пожалеете пару строк.

Я также позволил себе преобразовать BrCv и BrSat в вещественные числа, прежде чем разделить их. Это может быть не то, что вы хотите, но это то, на что вы должны обратить внимание.

person Edmondo Giovannozzi    schedule 23.09.2015
comment
Ну да, но это более логичный способ написать это. Я обновляю ответ, чтобы позаботиться о вашем комментарии. - person Edmondo Giovannozzi; 23.09.2015