我已经阅读了一些这方面的主题,但我不认为它回答了我的问题。如果它确实那么请指导我正确的主题,我一定会再看一遍。
这是我的问题:
我想编写一个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 :(得分: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个数字,从[0,0 .... 0]开始。然后,在“while”循环(将替换你的n嵌套for循环)中,尝试增加最右边的条目(数字)。如果它等于n,则返回零并向左递增。一旦你设法增加一个值而没有达到n,那么你就“完成”并且可以使用这些数字作为你的指数。
非常简单 - 你每次只增加1个。
然后,对于fortran的基于1的索引,每个数字加1。换句话说,将上面改为1开始,然后向左移动n + 1.
例如,对于n = 4: