Inicialización de arreglos de 2 variables INTEGER , DIMENSIÓN (4, 3) : : ini(4, 3) DO i=1, 4 DO j= 1,3 ini(i, j) = j END DO END DO i=1 1 2 3 i=2 1 2 3 i=3 1 2 3 i=4 1 2 3 j=1 j=2 j=3 Ini es de 4x3 Pero si inicializamos con: (/1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3/) Inies de es 1x12 Aunque los 2 arreglos tienen el mismo numero de elementos, no tienen la misma forma y no pueden ser usados en la misma operación. Para transformalo está la función intrínseca RESHAPE Ej ini= RESHAPE ((/1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3/), (/4, 3/) Convierte al vector 1X12 en una matriz de 4X3 la cual es asignada a ini: INTEGER, DIMENSION (4,3) : : ini (4,3)=& RESHAPE ((/1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3/), (/4, 3/) Buena costumbre: Cuando se trabaja con matrices conservar su forma. Leerlas y escribirlas con DO o DO implícitos y al realizar operaciones→ programas mas entendibles. Matrices y subconjuntos de matrices Se puede realizar opera raciones aritméticas con dos matrices cuando son conformes o una es un escalar Ej a= 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Para realizar un subconjunto de la matriz a 1 a(1, : ) = [ 1 2 3 4 5 ] 6 a( : , 1)= 11 16 21 a(1: 3, 1: 5: 2) = 1 3 5 6 8 10 11 13 15 Arreglos de mas de 2 dimensiones Ej 2x2x2 A(1,1,1) A(2,1,1) A(1,2,1) A(2,2,1) A(1,1,2) A(2,1,2) A(1,2,2) A(2,2,2) Generalizando para N dimensiones: El primer subíndice es el que se mueve mas rápidamente, un poco mas lento el segundo… el último es el más lento de todos. Esto se debe tener en cuenta para inicializar, leer o escribir….. Enmascarar : la construcción WHERE Ej: Queremos calcular el logaritmo a una matriz DO i=1, ifin DO j=1, jfin logval(i,j)= log(valor(i,j)) END DO END DO Otra forma: logva= log (valor) Pero no tubimos en cuenta si exiistia algun valor negativo o un 0 para la cual la función LOG no es válida. Para evitar ese error se deberia programar: DO i=1,ifin DO j=1,jfin IF(valor(i,j) >0.) then logval(i, j) = LOG(valor(i,j)) ELSE logval(i, j) = -99999. END IF END DO END DO A esta asignación se le dice enmascarar En FORTRAN 90 existe una función que realiza esta asignación: WHERE [nombre] WHERE ( mask_exp) Sentencias de asignación del arreglo !Bloque 1 ELSEWHERE [nombre] Sentencias de asignación del arreglo !Bloque 2 END WHERE [nombre] Si la expresión mask_exp es verdad se ejecuta el Bloque 1, en caso contrario se ejecuta el Bloque 2. Ej WHERE (valor>0) logval=LOG(valor) ELSEWHERE logval=-99999. ENDWHERE El FORTRAN 95 agrega una clausula mas al WHERE [nombre] WHERE ( mask_exp1) Sentencias de asignación del arreglo !Bloque 1 ELSEWHERE ( mask_exp2) [nombre] Sentencias de asignación del arreglo !Bloque 2 ELSEWHERE [nombre] Sentencias de asignación del arreglo !Bloque 3 END WHERE [nombre] En los FORTRAN 90/95 también es válido WHERE(mask_exp) sentencia de asignación del arreglo Forall permite aplicar operaciones a elememto por elemento de una matriz o a un subconjunto , ya sea a través de los índices o una expresión lógica. En general: [nombre] FORALL (in1= icom, ifin, incr, [in2= ico, m2, ifin2, incr…..exp_log] sentencia 1 …….. sentencia n END FORALL [nombre] Ej SI se quiere conocer la inversa de una matriz de números reales FORALL(i=1:n, j=1: m , r(i,j)/=0 r(i, j) =1./ r (i, j) END FORALL FORALL puede representar un DO anidado combinado con un IF DO i= 1,n DO j=1,m IF (r (i, j)/= 0.) THEN r (i, j)=1./ r (i, j) END IF END DO END DO FORALL (in1= icom, ifin, incr, [in2= ico, m2, ifin2, incr…..exp_log] sentencia de asignación