2010-11-01 9 views
9

Quiero inicializar una matriz en una línea con un doblar implícito do. Sin embargo, siempre obtengo un error de sintaxis o forma. ¿Alguien puede ayudarme a corregir el siguiente constructo?Inicialización implícita del conjunto de bucles do

integer myarray :: (maxdim, nr) 

myarray(1:maxdim,nr) = (/ (/i,i=1,maxdim/),nr /) 

Respuesta

16

Está inicializando una matriz con MAXDIM filas y NR columnas, y parece que cada columna contiene los números enteros 1 a MAXDIM.

Como primer paso, seguir adelante y escribir a cabo el actual DO -loop:

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

colapsar el bucle interno a una estructura de bucle implícito:

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

Cuando tratamos de contraer la bucle externo, sin embargo, sucede algo extraño:

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

Ahora, obtengo un inc ompatible clasifica el error como lo hizo. Como yo no soy muy bueno en los implícitos do-bucles o bien, miré a los resultados intrínsecos shape para el constructor de matrices:

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

Esto muestra

5  10 
    50 

El constructor de matrices es simplemente expandiendo una matriz 1-D, aplanando cualquier construcción de matriz anidada. De hecho, podemos soltar el segundo conjunto de (/ /) para simplificar. Como todo está ya en el orden correcto, podemos usar el reshape intrínseco para garantizar el rango correcto. Mi programa de pruebas completo es entonces:

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

Tenga en cuenta que también es válido para escribir 'myarray_implicit = cambio de forma ((/ ((i, i = 1, MAXDIM), j = 1, NR) /), shape (myarray_implicit)) ' para evitar volver a escribir explícitamente las dimensiones de su matriz. – Markus

6

El do loop implícito solo creará un vector, por lo que tendrá que darles forma. Algo como esto:

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

o tal vez desea una más complicada, jerarquizado, implícita-do bucle:

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

Tenga en cuenta que estoy usando la convención de Fortran2003 [ ] para delimitar las construcciones de matriz, en lugar que (/ /). Tenga en cuenta también que debe declarar las variables de índice implícitas do loop.

Cuestiones relacionadas