【问题标题】:Implied do loops in FortranFortran 中的隐含 do 循环
【发布时间】:2015-09-22 20:53:28
【问题描述】:

如何用隐含的 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

【问题讨论】:

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

标签: loops fortran gfortran do-loops


【解决方案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 转换为实数,然后再将它们分开。它可能不是你想要的,但它是你所关注的。

【讨论】:

  • 嗯,是的,但这是更合乎逻辑的写法。我会更新答案以处理您的评论。
猜你喜欢
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
  • 2022-11-29
相关资源
最近更新 更多