2016-03-25 5 views
1

Ich werde eine do-Schleife über mögliche Werte eines Array-Elements schreiben. Genauer gesagt habe ich ein Array, sagen wir A(:) mit der Größe n und jedes Element des Arrays A kann 0 oder 1 sein. Ich möchte über alle möglichen Werte von Elementen von A iterieren. Natürlich ist ein einfacher WegWie man alle Variationen eines Arrays mit Elementen erhält, die null oder eins sind

do A(1)=0, 1 
do A(2)=0, 1 
    .... 
    ! do something with array A 

end do 
end do 

aber die Größe meines Arrays ist groß und diese Methode ist nicht sehr geeignet. Gibt es einen besseren Weg, dies zu tun?

+0

Ich bin nicht sicher, habe ich die Frage ... Möchten Sie alle möglichen Variationen des Arrays haben, wobei die Elemente entweder Null oder Eins sind? ZB: '00',' 01', '10',' 11' für ein Array der Länge zwei? –

+0

Lieber Alexander, ja, genau. Ich möchte alle möglichen Variationen des Arrays haben, wobei die Elemente entweder Null oder Eins sind. Aber um die Erinnerung zu speichern, möchte ich nicht alle möglichen Konfigurationen in einer größeren Matrix speichern. –

+0

Wie groß wird das Array sein? –

Antwort

0

Da dies nur binär ist, verwenden Sie für diese Aufgabe keine Ganzzahlen. inkrementieren nur die Ganzzahl um eins für jede der Kombinationen und die entsprechenden Bits ausgelesen btest Verwendung:

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 

Dieses einfache Code A mit allen Kombinationen (einer nach dem anderen) füllt und druckt sie nacheinander.

./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 

Beachten Sie, dass Fortran nur signed integers hat, so das höchste Bit ist hier nicht verwendbar. Dies lässt Sie bis zu 2^(32-1) Kombinationen für (Standardeinstellung) 4 Byte Ganzzahlen, wenn Sie wie hier gezeigt von Null beginnen (Array-Länge bis zu 31).

das gesamte Spektrum zu erhalten, in der folgenden Art und Weise die Schleife tun:

do i=-huge(1)-1,huge(1) 

Dies gibt Ihnen die vollen 2^32 verschiedenen Variationen für Arrays mit einer Länge von 32

+0

Vielen Dank für Ihre interessante Lösung. In Zukunft muss ich meinen Code für nicht binäre Werte verallgemeinern. Gibt es einen ähnlichen Trick, wenn die Werte von A (i) 0,1, ..., M sind? –

+0

@ Math-Fort Ja, aber diese allgemeine Lösung wurde zB beantwortet [http://stackoverflow.com/questions/22285705/permutations-with-repetition-algorithm] :) –

+0

Lieber Alexander, gibt es einen Weg ein Array der Länge '2^(32)' zu behandeln? Vielen Dank, :-( –