2012-02-18 57 views
1

我已阅读了一些关于此的主题,但我不完全认为它回答了我的问题。如果确实如此,请将我引向正确的话题,我一定会再次看。n在fortran90中嵌套for循环

这里是我的问题:

我想要写一个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'来做到这一点?

+0

我”我意识到这一点。一个简单的allocate()和deallocate()会照顾到这一点 – drjrm3 2012-02-18 22:55:44

回答

1
如果你写出来的指数

,你有什么是基数n的n位数(几乎是 - 有1偏移,因为你在fortran中使用基于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]
    • 做你的内循环作用
  • 等。
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