2012-01-27 17 views
10

Vorrei allocare un array B con la stessa forma e avere gli stessi limiti inferiore e superiore di un altro array A. Ad esempio, ho potuto utilizzareAssegnazione di matrici della stessa dimensione

allocate(B(lbound(A,1):ubound(A,1), lbound(A,2):ubound(A,2), lbound(A,3):ubound(A,3))) 

Ma non solo questo è poco elegante, diventa anche molto fastidioso per array (anche) dimensioni superiori.

speravo in qualcosa di più simile

allocate(B(shape(A))) 

che non funziona, e anche se questo ha funzionato, ogni dimensione sarebbe iniziare a 1, che non è quello che voglio.

Qualcuno sa come posso facilmente allocare un array per avere le stesse dimensioni e limiti di un altro array facilmente per dimensioni di array arbitrarie?

+1

Posso chiedere perché è necessario fare questo. Non puoi semplicemente allocare 'B' nello stesso momento di' A' (o almeno nello stesso ambito, quando avrai accesso ai parametri della matrice/limiti usati per allocare 'A'). In alternativa, se si passa 'A' a una funzione o subroutine non si può semplicemente avere una matrice di dimensioni presunte' B' locale a quella routine che assume la forma di 'A'? – Chris

+0

Beh, suppongo di non aver bisogno di questo, è davvero poco elegante. L'array 'A' è allocato in un diverso file .f con i limiti' A (nlmx-a_offset: nlpx + b_offset, ...) ', noterete che si tratta di più caratteri rispetto all'utilizzo di l/ubound. – user1173081

+0

Quindi penso che la risposta di M.S.B. sia probabilmente il modo migliore per fare ciò che stai cercando di fare. – Chris

risposta

8

è possibile definire in una direttiva del preprocessore, ma che sarà con una dimensionalità fissa:

#define DIMS3D(my_array) lbound(my_array,1):ubound(my_array,1),lbound(my_array,2):ubound(my_array,2),lbound(my_array,3):ubound(my_array,3) 

allocate(B(DIMS3D(A))) 

non dimenticate di compilare con per esempio l'opzione di -cpp (gfortran)

Se si utilizza Fortran 2003 o in precedenza, è possibile utilizzare l'argomento fonte:

allocate(B, source=A) 

ma questo sarà anche copiare gli elementi di A a B.

5

Se sei facendo così tanto e pensandoci troppo brutti, potresti scrivere la tua subroutine per prendertene cura, copy_dims (template, new_array), incapsulare la riga del codice sorgente che mostri. È anche possibile configurare un'interfaccia generica in modo che possa gestire matrici di diversi gradi: vedere how to write wrapper for 'allocate' per un esempio di questo concetto.

+0

sì, spostare le cose su subroutine dedicate è molto buono se lo userai molto e se hai bisogno di una certa flessibilità! – steabert

11

A partire dal Fortran 2008, v'è ora l'argomento MOLD optional:

ALLOCATE(B, MOLD=A)

stampo = identificatore funziona quasi allo stesso modo come SOURCE =. Se si specifica MOLD = e source_expr è una variabile, il suo valore non deve essere definito. Inoltre, MOLD = non copia il valore di source_expr nella variabile da allocare.

Fonte: IBM Fortran Ref

Problemi correlati