【问题标题】:Recursive N-nested loop递归 N 嵌套循环
【发布时间】:2015-11-16 17:54:54
【问题描述】:

假设您有一个方阵 M(N,N),并且您希望对所有对求和,这样:

M(i,j)*M(i+1,j)+M(i,j)*M(i,j+1)

为此,最简单的方法是计算:

INTEGER i,j,N, SUMT
INTEGER M(100,100), c(101)

N=100
SUMT = 0
do j=1,N   
  c(j) = j
end do
c(N+1)=1

do j=1,N   
   do i=1,N
      SUMT = SUMT + M(i,j)*M(c(i+1),j)+M(i,j)*M(i,c(j*1))
   end do 
end do

注意:c 是应用周期性边界条件的快速方法。

在我的问题中,对于 3D 系统 { M(N,N,N) } 我应该执行以下操作:

M(i,j,k)*M(i+1,j,k)+M(i,j,k)*M(i,j+1,k)+M(i,j,k)*M(i,j,k+1)

所以代码是:

INTEGER i,j,k,N, SUMT
INTEGER M(100,100), c(101)
SUMT = 0
do j=1,N   
  c(j) = j
end do

c(N+1)=1 
N=100

do j=1,N   
   do i=1,N
      SUMT = SUMT +M(i,j,k)*M(c(i+1),j,k)+M(i,j,k)*M(i,c(j+1),k)+M(i,j,k)*M(i,j,c(k+1))
   end do 
end do

此时,我的问题是:

有没有办法用嵌套循环计算这个问题,这样 M 矩阵的维度是一个参数?我的意思是,我可以这样做:

INTEGER i,j,k,l,m,n,....
INTEGER N, SUMT, D
PARAMETER (N=100)
PARAMETER (D=3) !DIMENSION

INTEGER M(N**D), c(N+1)

if (dim=1) then
  do i=1,N
else if (dim=2) then
  do j=1,N
    do i=1,N
else if (dim=3) then
  do k=1,N
    do j=1,N
       do i=1,N
 ....

但是您是否考虑过在 fortran 77 中更优雅的解决方案?

我正在考虑使用暗 D 访问 M 矩阵,就好像它只有一个带有 N**D 空间的维度,但我认为如果在 N 的控制限制内应用 if 指令,它将工作得非常慢。有什么好主意,还是我应该考虑讨厌的 if-do 循环?

【问题讨论】:

  • 如果你关心优雅或简洁,忘记 Fortran 77,它是 2015 年。但我看不到问题所在。为什么当它是参数时你需要所有三个分支?无论如何,编译器都会在优化期间丢弃它们。

标签: loops fortran do-loops


【解决方案1】:

我不知道 fortran,也不确定这是否是您想要的,但这里有一些伪代码可能会有所帮助

INTEGER N, D, m
INTEGER I(D)     ! indices in each dimension
do j=1,N**D      ! loop over whole matrix
  m = j          
  do k=1,D           ! for each dimension
    I(k) = MOD(m,N)  ! get index in dimension k
    m = m / N        ! and move to next most-significant "register"
  end do
  ! now you have an array of indices for this item
  ! do stuff here
end do

例如D=3, N=100 表示 j 从 1 变为 1000000
I 依次变为数组 [1,1,1], [2,1,1], [3,1,1], ... [100,100,100]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2010-12-12
    • 1970-01-01
    相关资源
    最近更新 更多