[9. Ciclos (Loops) ]  [Tutorial de Fortran]  [11. Subprogramas ]

10. Arreglos

Muchos cálculos científicos usan vectores y matrices. El tipo de dato usado en Fortran para representar tales objetos es el array. Un arreglo unidimensional corresponde a un vector, mientras que un arreglo bidimensional corresponde a una matriz. Para entender como son usados en Fortran 77, no solamente se requiere conocer la sintaxis para su uso, sino también como son guardados estos objetos en la memoria.

Arreglos Unidimensionales

El arreglo más sencillo es el de una dimensión, el cual es sólo un conjunto de elementos almacenados secuencialmente en memoria. Por ejemplo, la declaración
      real d(20)
declara a d como un arreglo del tipo real con 20 elementos. Esto es, d consiste de 20 números del tipo real almacenados en forma contigua en memoria. Por convención, los arreglos en Fortran estan indexados a partir del valor 1. Por lo tanto el primer elemento en el arreglo es d(1) y el último es d(20). Sin embargo, se puede definir un rango de índice arbitrario para los arreglos como se observa en los siguientes ejemplos:
      real b(0:19), c(-162:237)
En el caso de b es similar con el arreglo d del ejemplo previo, excepto que el índice corre desde el 0 hasta el 19. El arreglo c es un arreglo de longitud 237-(-162)+1 = 400.

El tipo de los elementos de un arreglo puede ser cualquiera de los tipos básicos de datos ya vistos. Ejemplos:

      integer i(10)
      logical aa(0:1)
      double precision x(100)

Cada elemento de un arreglo puede ser visto como una variable separada. Se referencia al i-ésimo elemento de un arreglo a por a(i). A continuación se muestra un segmento de código que guarda los primeros 10 cuadrados en un arreglo cuad

      integer i, cuad(10)

      do i=1, 10, 1
         cuad(i) = i**2;
         write(*,*) cuad(i)
      enddo

Un error común en Fortran es hacer que el programa intente accesar elementos del arreglo que estan fuera de los límites. Lo anterior es responsabilidad del programador, ya que tales errores no son detectados por el compilador.

Arreglos Bidimensionales

Las matrices son muy importantes en álgebra lineal. Las matrices son usualmente representadas por arreglos bidimensionales. Por ejemplo, la declaración
      real A(3,5)
define un arreglo bidimensional de 3 x 5 = 15 números del tipo real. Es útil pensar que el primer índice es el índice del renglón, y el segundo índice corresponde a la columna. Por lo tanto se vería como:

 12345
1     
2     
3     

Un arreglo bidimensional podría también tener índices de rango arbitrario. La sintaxis general para declarar el arreglo es:

nombre (índice1_inf : indice1_sup, índice2_inf : indice2_sup)
El tamaño total del arreglo es de
tamaño = (indice1_sup - indice1_inf + 1) x (indice2_sup - indice2_inf + 1)

Es muy común en Fortran declarar arreglos que son más grandes que la matriz que se va a guardar. Lo anterior es porque Fortran no tiene almacenamiento dinámico de memoria como el lenguaje C. Por ejemplo:

      real A(3,5)
      integer i,j
c
c     Solamente se usará una submatriz de 3 x 3 del arreglo
c
      do i=1, 3
         do j=1, 3
            a(i,j) = real(i)/real(j)
         enddo
      enddo
Los elementos en la submatriz A(1:3,4:5) no estan definidas. No se debe considerar que estos elementos estan inicializados a cero por el compilador (algunos compiladores lo hacen, pero otros no).

Forma de Almacenamiento para un arreglo bidimensional

Fortran almacena los arreglos de más de una dimensión como una secuencia contigua lineal de elementos. Es importante saber que los arreglos bidimensionales son guardados por columnas. Por lo tanto en el ejemplo anterior, el elemento del arreglo (1,2) esta después del elemento (3,1), luego sigue el resto de la segunda columna, la tercera columna y así sucesivamente.

Considerando otra vez el ejemplo donde solamente se usa la submatriz de 3 x 3 del arreglo de 3 x 5. Los primeros 9 elementos que interesan se encuentran en las primeras nueve localidades de memoria, mientras que las últimas seis celdas no son usadas. Lo anterior funciona en forma transparente porque la dimensión principal es la misma para ambos, el arreglo y la matriz que se guarda en el arreglo. Sin embargo, frecuentemente la dimensión principal del arreglo será más grande que la primera dimensión de la matriz. Entonces la matriz noserá guardada en forma contigua en memoria, aún si la arreglo es contiguo. Por ejemplo, supongamos que la declaración hubiera sido A(5,3) entonces hubiera habido dos celdas "sin usar" entre el fin de la primera columna y el principio de la siguiente columna (suponiendo que asumimos que la submatriz es de 3 x 3).

Esto podría parecer complicado, pero actualmente es muy simple cuando se empieza a usar. Si se tiene en duda, puede ser útil hallar la dirección de un elemento del arreglo. Cada arreglo tendrá una dirección en la memoria asignada a partir del arreglo, que es el elemento (1,1). La dirección del elemento (i,j) esta dada por la siguiente expresión:

dirección[A(i,j)] = dirección[A(1,1)] + (j-1)*princ + (i-1)
donde princ es la dimensión principal (la columna) de A. Observar que princ es en general diferente de la dimensión actual de la matriz. Muchos errores de lógica en Fortran son causados por lo anterior, por lo tanto es importante entender la diferencia.

Arreglos Multi-dimensionales

Fortran 77 permite arreglos de hasta 7 dimensiones. La sintaxis y forma de almacenamiento es análoga al caso de dos dimensiones.

La sentencia dimension

Hay una forma alterna para declarar un arreglo en Fortran 77. Las siguientes sentencias
real A, x
dimension x(50)
dimension A(10,20)
son equivalentes a
real A(10,20), x(50)
La sentencia dimensión es considerada actualmente como una forma en desuso.


Ejercicios

Ejercicio A
Escribir una subrutina que haga el producto escalar y = A*x, v.g. el índice j deberá estar en el ciclo más interno.

Ejercicio A
Escribir un program que declare una matriz A de la siguiente forma
      integer nmax
      parameter (nmax=40)
      real A(nmax, nmax)
Declarar apropiadamente los vectores x e y e inicializar
m=10, n=20,
A(i,j) = i+j-2 para 1 <= i <= m y 1<= j <= n
x(j) = 1 para 1 <=j <= n. Calcular y = A*x. Mostrar el resultado de y.


 [9. Ciclos (Loops) ]  [Tutorial de Fortran]  [11. Subprogramas ]