Loops Fortran中的隐含do循环

Loops Fortran中的隐含do循环,loops,fortran,gfortran,do-loops,Loops,Fortran,Gfortran,Do Loops,如何对隐含的do循环执行相同的操作? 我想用两个隐含的do循环替换Vcvo和Vcvonew的现有循环 这是我的代码: 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 V

如何对隐含的do循环执行相同的操作? 我想用两个隐含的do循环替换Vcvo和Vcvonew的现有循环

这是我的代码:

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

隐含的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之前,我还自由地将它们转换为real。这可能不是你想要的,但你必须注意。

你想让
i+j*BrCv/BrSat
是一个整数表达式吗?为了回应@Ross的评论,你真正关心的是什么?可以很容易地在
vcvo
的数组构造函数中使用隐含do(这很容易,我不确定我是否理解这个问题),但是除了让五行变得不那么直观之外,我不知道为什么你关心的是隐含do。我需要一个关于Vcvonew的建议。如何用双隐含do循环替换我的do循环解决方案,例如,我尝试使用此解决方案,但不正确:((Vcvonew(I,j),j=1,BrSat),I=1,BrCv-1)为什么您需要一个隐含的do解决方案来覆盖您拥有的do构造,或者甚至
vcvonew=vcvo(1:,:)
?对我来说,第一类答案是否真的会是你所认为的答案,这一点并不明显。因为这里可能更合理。是的,但这是一种更符合逻辑的写作方式。我更新了答案,以考虑您的评论。