如何获取元素为零或一的数组的所有变体
How to obtain all variations of an array with elements being zero or one
我将对数组元素的可能值编写一个 do 循环。更具体地说,我有一个数组,比如大小为 n 的 A(:)
,数组 A
的任何元素都可以是 0
或 1
。我想遍历 A
元素的所有可能值。当然一个简单的方法是
do A(1)=0, 1
do A(2)=0, 1
....
! do something with array A
end do
end do
但是我的数组很大,这种方法不是很合适。有更好的方法吗?
既然这只是二进制,为什么不(错误地)使用整数来完成这项任务?只需为每个组合将整数递增 1,然后使用 btest
读出相应的位:
program test
implicit none
integer, parameter :: n = 3
integer :: i
integer :: A(n)
integer :: idx(n) = [(i, i=0,n-1)] ! bit positions start at zero
! Use a loop to increment the integer
do i=0,2**n-1
! Get the bits at the lowest positions and map true to "1" and false to "0"
A = merge( 1, 0, btest( i, idx ) )
print *,A
enddo
end program
这个简单的代码用所有组合(一次一个)填充 A
并连续打印它们。
./a.out
0 0 0
1 0 0
0 1 0
1 1 0
0 0 1
1 0 1
0 1 1
1 1 1
注意Fortran只有signed integers,所以这里不能使用最高位。如果您从零开始(数组长度最大为 31),那么(默认)4 字节整数的组合最多为 2^(32-1)
。
要获得完整范围,请按以下方式进行循环:
do i=-huge(1)-1,huge(1)
这为长度为 32 的数组提供了完整的 2^32
不同变体。
我将对数组元素的可能值编写一个 do 循环。更具体地说,我有一个数组,比如大小为 n 的 A(:)
,数组 A
的任何元素都可以是 0
或 1
。我想遍历 A
元素的所有可能值。当然一个简单的方法是
do A(1)=0, 1
do A(2)=0, 1
....
! do something with array A
end do
end do
但是我的数组很大,这种方法不是很合适。有更好的方法吗?
既然这只是二进制,为什么不(错误地)使用整数来完成这项任务?只需为每个组合将整数递增 1,然后使用 btest
读出相应的位:
program test
implicit none
integer, parameter :: n = 3
integer :: i
integer :: A(n)
integer :: idx(n) = [(i, i=0,n-1)] ! bit positions start at zero
! Use a loop to increment the integer
do i=0,2**n-1
! Get the bits at the lowest positions and map true to "1" and false to "0"
A = merge( 1, 0, btest( i, idx ) )
print *,A
enddo
end program
这个简单的代码用所有组合(一次一个)填充 A
并连续打印它们。
./a.out
0 0 0
1 0 0
0 1 0
1 1 0
0 0 1
1 0 1
0 1 1
1 1 1
注意Fortran只有signed integers,所以这里不能使用最高位。如果您从零开始(数组长度最大为 31),那么(默认)4 字节整数的组合最多为 2^(32-1)
。
要获得完整范围,请按以下方式进行循环:
do i=-huge(1)-1,huge(1)
这为长度为 32 的数组提供了完整的 2^32
不同变体。