n在fortran90中嵌套for循环

时间:2012-02-18 22:22:20

标签: nested-loops fortran90

我已经阅读了一些这方面的主题,但我不认为它回答了我的问题。如果它确实那么请指导我正确的主题,我一定会再看一遍。

这是我的问题:

我想编写一个for循环,循环遍历数组的每个可能组合,其中数组的长度为'n'。

也就是说,如果n = 2,那么我的for循环将是

do i1 = 1,2
    do i2 = 1,2
         ! do stuff here
    enddo
enddo

如果n = 3,那么我的数组看起来像

do i1 = 1,3
    do i2 = 1,3
         do i3 = 1,3
             ! do stuff here
         enddo
    enddo
enddo

等等。我将如何编写一个例程,通过一个输入变量'n'自动执行此操作?

2 个答案:

答案 0 :(得分:1)

我想你只能通过将循环折叠成一个n ** n循环来实现这一点,并从折叠的全局索引中计算出单个n个索引(或者只是用不同的步幅计算它们)。

编辑:试图将其放入示例代码:

do i=1,n**n
  do j=1,n
    ind(j) = mod((i-1)/max((j-1)*n,1),n) + 1
  end do
  ! Some code using ind(1:n)
end do

答案 1 :(得分:1)

如果你写出索引,你所拥有的是基数为n的n位数(几乎 - 因为你在fortran中使用了基于1的索引,所以偏移量为1)。你所要求的是这个数字可能带来的每一个可能值。

换句话说,如果我们暂时使用基于0的索引,那么你有:

  • n = 2,值= 00,01,10,11(从0到3的二进制计数)
  • n = 3,值= 000,001,002,010,011,012,020,021,022,100,101,102,110,111,112,120,121,122,200,201,202,210,211,212,220,221,222(三元(?)从0到26)

所以你要问的是如何在一般情况下这样做。

你可以通过使用一个数组来保存n个数字,从[0,0 .... 0]开始。然后,在“while”循环(将替换你的n嵌套for循环)中,尝试增加最右边的条目(数字)。如果它等于n,则返回零并向左递增。一旦你设法增加一个值而没有达到n,那么你就“完成”并且可以使用这些数字作为你的指数。

非常简单 - 你每次只增加1个。

然后,对于fortran的基于1的索引,每个数字加1。换句话说,将上面改为1开始,然后向左移动n + 1.

例如,对于n = 4:

  • 以[1,1,1,1]开头
    • 做你的内循环动作
  • 最右边增加到[1,1,1,2]
    • 做你的内循环动作
  • 最右边增加到[1,1,1,3]
    • 做你的内循环动作
  • 最右边增加到[1,1,1,4]
    • 做你的内循环动作
  • 最右边增加到[1,1,1,5]
  • 您递增的数字现在为n + 1,这意味着返回1并将数字增加到左[1,1,2,1]
    • 做你的内循环动作
  • 最右边增加到[1,1,2,2]
    • 做你的内循环动作
  • 等。