Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Fortran4 PDF
Fortran4 PDF
Vectores y matrices
En FORTRAN se puede utilizar un tipo especial de variable que sirve, en particular, para
almacenar vectores y matrices. De esta forma, se utiliza un sólo nombre para referirse al
conjunto de direcciones de memoria en las que se almacena la matriz o vector. En lenguaje
informático a estos conjuntos de datos se les suele llamar tablas (también arrays o tableros).
39
Ampliación de Cálculo Numérico. Introducción a FORTRAN90
EJEMPLO:
real*4, allocatable :: tabla(:,:)
...
print*,’>> Dimension de la matriz ? ’
read*,n
allocate(tabla(n,n))
Con la sentencia ALLOCATE se pueden crear varias tablas a la vez, separándolas por
comas.
Una tabla creada con la sentencia ALLOCATE puede ser destruida, cuando ya no se use,
con la sentencia:
DEALLOCATE(nombre_tabla)
Una tabla dinámica que ya haya sido creada (ALLOCATE) no puede ser creada de nuevo
a menos que se destruya previamente. Para saber si una tabla dinámica está creada o no en
un momento dado se puede emplear la función intrı́nseca
ALLOCATED(tabla)
que devuelve el valor lógico .TRUE. si tabla está creada y .FALSE. en caso contrario
EJEMPLO:
real*4 :: a(10,10)
a=0.
Este ejemplo declara una matriz real 10 × 10 y da a todos sus elementos el valor cero.
En general, una asignación de un escalar a una tabla es entendida por el compilador
como una asignación elemento a elemento, es decir, que se le asigna el valor escalar a cada
uno de los elementos de la tabla.
También se pueden utilizar elementos de una tabla de forma individual. Para ello se
referencian mediante su nombre y los valores de sus subı́ndices encerrados entre paréntesis:
v(i) para vi y a(i,j) para aij
EJEMPLO:
real*4 :: a(10,10)
do j=1,10
do i=1,10
a(i,j)=real(i+j)
end do
end do
Este ejemplo asigna a cada elemento a(i,j) de la matriz a el valor de la suma de sus
subı́ndices.
Los subı́ndices de una tabla pueden ser constantes, variables o expresiones, necesaria-
mente de tipo entero.
En el caso de tablas de una sóla dimensión esto es fácil. Ası́, por ejemplo, si el vector
real o entero v está almacenado a partir de la dirección de memoria número iv, el elemento
v(k) estará almacenado en la dirección de memoria iv + k − 1.
EJEMPLO:
integer :: nvec(5)
nvec=(/ (i,i=1,5) /)
( valor, indice=min,max,paso )
EJEMPLO:
integer :: nvec(10)
real*4 :: v(10)
pi=3.141593
h=pi/9.
nvec=(/ (i,i=2,20,2) /)
v=(/ (cos((i-1)*h),i=1,10) /)
nvec=(2,4,6,8,10,12,14,16,18,20)
EJEMPLO:
real*4 :: v(10)
v=(/0.,(log(real(i)),i=1,9) /)
Debe tenerse en cuenta que con este mecanismo sólo se puede crear un vector (i.e. una
tabla de una dimensión) luego, por sı́ solo, no es apto para asignar valores a una tabla con
más de una dimensión. Más adelante se verá cómo puede hacerse.
También se pueden incluir tablas en expresiones con operadores aritméticos, como por
ejemplo:
EJEMPLO:
a=0.5 + 1./b
c=a*b
Para ello las tablas deben ser compatibles, es decir, deben tener las mismas dimensiones.
Las operaciones se realizan por elementos: con la instrucción a=0.5+1./b se asigna a cada
elemento a(i,j) el valor 0.5+1./b(i,j) y con la instrucción c=a*b se asigna a cada elemento
c(i,j) el valor a(i,j)*b(i,j).
Los escalares son compatibles con todas las tablas, ya que su aparición en una expresión
aritmética con tablas se entiende siempre elemento a elemento. Ası́, la asignación a una
tabla de un valor escalar se entiende elemento a elemento, es decir, se asigna el valor escalar
a cada elemento de la tabla. La suma de un escalar a una tabla se entiende como la suma
del escalar a cada uno de los elementos de la tabla. La multiplicación de un escalar por una
tabla tiene el sentido habitual, esto es, se multiplica cada elemento de la tabla por el escalar.
De la misma forma, se pueden utilizar tablas como argumentos de funciones instrı́nsecas.
Por ejemplo,
EJEMPLO:
real*4 :: a(5,5),b(5,5)
a=exp(b)
EJEMPLO:
real*4 :: a(5,5)=0.0
real*4 :: v(11)=(/ (i/10.,i=0,10) /)
integer :: m(4,3)
m=reshape( (/(i,i=1,12)/) , (/4,3/) )
real*4 :: a(20,20)
n=20
n1=19
a=reshape((/4.,((/(0.,i=1,n1),1.,4./),j=1,n1)/),(/n,n/))
TRANSPOSE(tabla)
donde tabla es necesariamente una tabla con dos dimensiones, es decir, una matriz, calcula
la matriz transpuesta de tabla.
La subrutina
RANDOM_NUMBER(a)
EJEMPLO:
read*,v(k)
print*,a(7,3)
EJEMPLO:
real*4 :: a(3,4)
integer :: index(10,20)
...
print*,a
print*,index(1:5,1:5)
EJEMPLO:
real*4 :: a(4,4)
do i=1,5
print*,(a(i,j),j=1,4)
end do
Las órdenes anteriores imprimen la tabla a por filas: para cada valor de i se imprimen,
con una sola orden print, todos los elementos de la forma a(i,j), para j variando
desde 1 hasta 4.
EJEMPLO:
real*4 :: v(10)
do i=1,10
print*,v(i)
end do
EJEMPLO:
program ejemplo
real*4, allocatable :: a(:,:)
print*,’ >> Dimension: ’
read*,n
allocate(a(n,n))
call random_number(a)
call sumatodos(suma,a,n)
print*,suma
end program ejemplo
!
subroutine sumatodos(suma,a,n)
real*4 :: a(n,n)
suma=0.
do i=1,n
do j=1,n
suma=suma+a(i,j)
end do
end do
end subroutine sumatodos