递归N嵌套循环

时间:2015-11-16 17:54:54

标签: loops fortran do-loops

考虑到你有一个方阵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中有一个更优雅的解决方案吗?

我正在考虑使用Dim D访问M矩阵,好像它只有一个带有N ** D空格的维度,但我认为如果在控制N的控制范围内应用if-instructions,它将工作得非常慢。任何好主意或我应该考虑讨厌的if-do循环?

1 个答案:

答案 0 :(得分:0)

我不了解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

e.g。 D=3N=100表示 j从1到1000000 I先后成为数组[1,1,1], [2,1,1], [3,1,1], ... [100,100,100]