2012-01-27 24 views
10

Me gustaría asignar una matriz B para que sea de la misma forma y tienen los mismos límites inferiores y superiores que otra matriz A. Por ejemplo, podría usarAsignación de matrices del mismo tamaño

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

Pero no sólo es poco elegante, sino que también se pone muy molesto para matrices de (incluso) dimensiones más altas.

Me esperaba algo más como

allocate(B(shape(A))) 

que no funciona, y aunque esto no hizo el trabajo, cada dimensión comenzaría a 1, lo cual no es lo que quiero.

¿Alguien sabe cómo puedo asignar fácilmente una matriz para tener el mismo tamaño y límites que otra matriz fácilmente para las dimensiones de matriz arbitraria?

+1

¿Puedo preguntar por qué es necesario hacer esto. ¿No puede asignar 'B' al mismo tiempo que' A' (o al menos en el mismo ámbito, cuando tendrá acceso a los parámetros de límites/formas de matriz utilizados para asignar 'A'). Alternativamente, si está pasando 'A' a una función o subrutina, ¿no puede simplemente tener una matriz de tamaño supuesto' B' local para esa rutina que asume la forma de 'A'? – Chris

+0

Bueno, supongo que no NECESITO esto, es realmente poco elegante. El conjunto 'A' se asigna en un archivo .f diferente con los límites 'A (nlmx-a_offset: nlpx + b_offset, ...)', observará que esto tiene más caracteres que el uso de l/ubound. – user1173081

+0

Entonces creo que la respuesta de M.S.B. es probablemente la mejor manera de hacer lo que está tratando de hacer. – Chris

Respuesta

8

Usted puede definir en una directiva de preprocesador, pero eso será con una dimensionalidad fija:

#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))) 

no se olvide de compilar con, por ejemplo, -cpp la opción (gfortran)

Si se utiliza Fortran 2003 o superior, se puede utilizar el argumento origen:

allocate(B, source=A) 

pero esto también va a copiar los elementos de A a B.

5

Si está Al hacer esto mucho y pensar que es demasiado feo, podría escribir su propia subrutina para encargarse de ello, copy_dims (template, new_array), encapsulando la línea de código fuente que muestra. Incluso podría configurar una interfaz genérica para que pueda manejar matrices de varios rangos - vea how to write wrapper for 'allocate' para obtener un ejemplo de ese concepto.

+0

sí, mover cosas a subrutinas dedicadas es muy bueno si lo usa mucho y si necesita flexibilidad. – steabert

11

A partir de Fortran 2008, ahora existe el argumento MOLD opcional:

ALLOCATE(B, MOLD=A)

el molde = especificador funciona casi de la misma manera como fuente =. Si especifica MOLD = y source_expr es una variable, no es necesario definir su valor. Además, MOLD = no copia el valor de source_expr a la variable que se asignará.

Fuente: IBM Fortran Ref

Cuestiones relacionadas