2010-11-01 5 views

Antwort

16

Sie initialisieren ein Array mit MAXDIM Zeilen und NR Spalten, und es sieht so aus, als ob jede Spalte die Ganzzahlen 1 bis MAXDIM enthält.

Als erster Schritt, gehen Sie vor und schreiben Sie den aktuellen DO -loop:

do j=1,NR 
    do i=1,MAXDIM 
     myarray(i,j) = i 
    end do 
end do 

Collapse die innere Schleife zu einer impliziten Schleifenstruktur:

do j = 1,NR 
    myarray(1:MAXDIM,j) = (/ (i, i=1,MAXDIM) /) 
end do 

Wenn wir versuchen, die zum Einsturz äußere Schleife, obwohl etwas Seltsames passiert:

myarray = (/ ((/ (i, i=1,MAXDIM) /), j=1,NR) /) 

Jetzt bekomme ich eine inc Kompatibler Rang Fehler wie Sie getan haben. Da ich auch nicht sehr gut an den impliziten do-Schleifen bin, habe ich mich die shape intrinsischen Ergebnisse für den Array-Konstruktor:

print *, shape(myarray) 
print *, shape((/ ((/ (i, i=1,MAXDIM) /), j=1,NR) /)) 

Dies gibt

5  10 
    50 

Das Array Konstruktor einfach erweitert Ein 1-D-Array, das alle verschachtelten Array-Konstruktionen abflacht. Wir können tatsächlich den zweiten Satz von (/ /) zur Vereinfachung fallen lassen. Da alles bereits in der richtigen Reihenfolge ist, können wir die reshape intrinsische verwenden, um den richtigen Rang sicherzustellen. Mein volles Testprogramm ist dann:

program sotest 
    implicit none 

    integer, parameter :: MAXDIM = 5 
    integer, parameter :: NR  = 10 

    integer :: i 
    integer :: j 
    integer :: myarray(MAXDIM, NR) 
    integer :: myarray_implicit(MAXDIM, NR) 

    do j = 1,NR 
     do i = 1,MAXDIM 
      myarray(i,j) = i 
     end do 
    end do 

    myarray_implicit = reshape((/ ((i,i=1,MAXDIM), j=1,NR) /), (/ MAXDIM, NR /)) 

    print *, all(myarray == myarray_implicit) 
end program sotest 
+7

Beachten Sie, dass es auch gültig ist 'myarray_implicit = reshape ((/ ((i zu schreiben, i = 1, MAXDIM), j = 1, NR) /), shape (myarray_implicit)) ' , um zu vermeiden, die Dimensionen Ihrer Matrix erneut explizit einzugeben. – Markus

6

Die implizite do-Schleife erzeugt nur einen Vektor, so dass Sie das umformen müssen. Etwas wie folgt aus:

integer, dimension(m,n) :: myarray 
integer :: ix, jx 
... 
myarray = reshape([ (ix, ix = 1, m*n) ], [ m, n ]) 

oder vielleicht wollen Sie eine kompliziertere, verschachtelt, implizierte-do-Schleife:

myarray = reshape([ ((ix+jx, ix = 1, m), jx = 1, n) ], [ m, n ]) 

Bitte beachte, dass ich die Fortran2003 Konvention von [ ] bin mit Array-Konstruktionen zu begrenzen, vielmehr als (/ /). Beachten Sie auch, dass Sie die impliziten do-Schleifenindexvariablen deklarieren müssen.