Conjunto de dados - CPGG-UFBA
Transcrição
Conjunto de dados - CPGG-UFBA
2 GEO764 - Programação avançada em Geofísica Conjuntos ] Conjuntos armazenam, simultaneamente, uma coleção de valores. Elementos individuais são referenciados por meio de subscritos. ] Vetor de 15 elementos 1 FORTRAN 90: Aula no 3 Conjunto de dados 2 3 13 14 15 ] Matriz 3 x 5 1,1 1,2 1,3 1,4 1,5 2,1 2,2 2,3 2,4 2,5 3,1 3,2 3,3 3,4 3,5 March 07 Hédison K. Sato 3 Terminologia sobre conjuntos ] Exemplos de declaração (definição) REAL, DIMENSION (15) :: x REAL, DIMENSION (1:3,1:5):: y, z ] As definições são conjunto com formas explícitas. ] Terminologia ordem (rank) - no. de dimensões limites (bounds) - limites inferior e superior dos índices. extensão (extent) - no. de elementos numa dimensão. tamanho (size) - no. total de elementos. forma (shape) - definido pela ordem e extensões. similaridade (conformable) - mesma forma. Ex.: y e z 4 Declarações ] Valores literais e constantes podem ser usados. REAL, DIMENSION(100) :: r REAL, DIMENSION(1:10,1:10):: s REAL :: t(10,10) REAL, DIMENSION(-10:-1) :: x INTEGER, PARAMETER :: ida=5 REAL, DIMENSION(0:ida-1) :: y REAL, DIMENSION(1+ida*ida,10):: z ] O limite inferior presumido é 1 (um) ] Os limites podem ser quaisquer. ] Conjuntos podem ter tamanho nulo (se ida=0) 5 Visualização dos conjuntos Similaridade de conjuntos REAL, DIMENSION(15) :: a REAL, DIMENSION(-4:0,0:2) :: b REAL, DIMENSION(5,3) :: c REAL, DIMENSION(0:4,0:2) :: d Elementos são denotados por um subscrito a(1) a(2) 6 a(14) a(15) b(-4,0) | c(1,1) | d(0,0) b(-4,2) | c(1,3) | d(0,2) b(0,0) | c(5,1) | d(4,0) b(0,2) | c(5,3) | d(4,2) ] Numa expressão, conjuntos e subconjuntos devem ser similares. ] Um escalar é similar a um conjunto de qualquer forma, cujos elementos têm o mesmo valor do escalar . ] Considerando as definições anteriores, C=D ! é válido B=A ! Inválido pois embora ! iguais em tamanho, ! têm formas distintas 7 Ordenamento dos elementos ] O Fortran 90 não especifica como os conjuntos devem ser armazenados na memória. Não existe nenhuma associação com o armazenamento. ] O Fortran 90 define um ordenamento dos elementos de um conjunto para certas situações: o índice mais à esquerda varia mais rapidamente. 8 Sintaxe com conjuntos ] Operando o conjunto como um todo. \ A = 0.0 anula todo o conjunto. \ B=C+D adiciona C e D e atribui o resultado a B. ] Operando sobre elementos de conjunto. \ A(1) = 0.0 anula um dos elementos do conjunto. \ B(0,0) = A(3) + C(5,1) atribui a um elemento de B, o resultado da soma de outros dois elementos. 9 Sintaxe com conjuntos ] Operando com seções de conjuntos: ] Funções elementares intrínsecas: B = SIN(C)+COS(D) A função é aplicada elemento a elemento, em paralelo. 10 ] Opera-se os conjuntos de forma similar às variáveis. ] Usa-se operadores intrínsecos entre conjuntos (ou seções) similares. \ A(2:4) = 0.0 anula os elementos A(2), A(3)e A(4). \ B(-1:0,1:2) = C(1:2,2:3) + 1.0 adiciona 1 a todos elementos de uma seção de C e atribui o resultado, a uma seção de B. Operando com conjuntos inteiros Operando com conjuntos inteiros \ B = C * D - B**2 é equivalente a execução em paralelo de: B(-4,0) = C(1,1)*D(0,0) - B(-4,0)**2 B(-3,0) = C(2,1)*D(1,0) - B(-3,0)**2 M B(-4,1) = C(1,2)*D(0,1) - B(-4,1)**2 M B(0,2) = C(5,3)*D(4,2) - B(0,2)**2 11 Seção de conjunto Visualização ] Supondo REAL, DIMENSION (1:6,1:8) :: P p(1:3,1:4) p(2:6:2,1:7:3) 12 Seção de conjunto Visualização 13 Seção de conjunto - Operação ] Supondo REAL, DIMENSION (1:6,1:8) :: P p(2:5,7:7) p(2:5,7) 14 ] Supondo REAL, DIMENSION (1:6,1:8) :: P ] São válidos P(1:3,1:4) = P(1:6:2,1:8:2) P(1:3,1:4) = 1.0 p(1:6:2,1:8:2) ] São inválidos P(2:8:2,1:7:3) = P(1:3,1:4) P(2:6:2,1:7:3) = P(2:5,7) ] P(2:5,7) é uma seção 1D enquanto P(2:5,7:7) é uma seção 2D. 15 Seção de conjuntos ] O subscrito triplo é usado para especificar um subconjunto. A forma geral é: [<limite1>]:[<limite2>][:<passo>] ] A seção começa no <limite1> e termina em, ou antes de, <limite2>. ] <passo> é o incremento pelo qual os locais são selecionados. ] <limite1>, <limite2> e <passo> devem ser expressões escalares inteiras. 16 Seção de conjuntos: exemplos ] ] ] ] ] ] ] ] ] ] ] ] A(:) A(3:9) A(3:9:1) A(m:n) A(m:n:k) A(8:3:-1) A(8:3) A(m:) A(:n) A(::2) A(m:m) A(m) ! ! ! ! ! ! ! ! ! ! ! ! O conjunto completo A(3) a A(9) a passo unitário Idem A(m) a A(n) a passo unitário A(m) a A(n) a passo k A(8) a A(3) a passo -1 A(8) a A(3) a passo 1 ⇒ tamanho nulo A(m) até A(limite_maximo), a passo 1 A(limite_mínimo) a A(n), a passo 1 A(lim_mín.) a A(lim_max.), a passo 2 seção com um elemento escalar. Não é uma seção. 17 Entrada/saída de conjuntos E/S de conjuntos: exemplo ] Considerando a matriz ] O conceito de ordenamento dos elementos de conjuntos é útil na definição da ordem em que os elementos de conjuntos são impressos. Se A é um conjunto 2D, PRINT *, A irá produzir A(1,1), A(2,1), A(3,1), ..., A(1,2), A(2,2), ... ] READ *, A irá atribuir os valores aos elementos nessa mesma ordem. ] Considerando a matriz A 1 2 3 4 5 6 7 8 9 ] Os comandos de impressão PRINT*, ”Conj. completo =”, A PRINT*, ”Conj. transposto =”,TRANSPOSE(A) produzem Conj. completo = 1 2 3 4 5 6 7 8 9 Conj. transposto = 1 4 7 2 5 8 3 6 9 A 1 2 3 4 5 6 7 8 9 ] Os comandos de impressão PRINT*, ”Elemento de conjunto=”, A(3,2) PRINT*, ”Seção de conjunto =”, A(:,1) PRINT*, ”Sub-conjunto =”, A(:2,:2) produzem Elemento de conjunto= 6 Seção de conjunto = 1 2 3 Sub-conjunto = 1 2 4 5 19 E/S de conjuntos: exemplo 18 Obtendo dados sobre conjuntos ] Supondo: REAL, DIMENSION(-10:10,23,14:28):: A ] LBOUND(SOURCE[,DIM]) limite inferior de um conjunto (ou limite na dimensão especificada): LBOUND(A) é (/-10,1,14/) (conjunto) LBOUND(A,1) é -10 (escalar) ] UBOUND(SOURCE[,DIM]) limite superior de um conjunto (ou limite na dimensão especificada) 20 Obtendo dados sobre conjuntos 21 22 Montadores de conjunto (/.../) ] Supondo: REAL, DIMENSION(-10:10,23,14:28):: A ] SHAPE(SOURCE) - forma de um conjunto: SHAPE(A) é (/21,23,15/) (conjunto) SHAPE((/4/)) é (/1/) (conjunto) ] SIZE(SOURCE[,DIM]) - total de elementos (ou na dimensão especificada): SIZE(A,1) é 21 SIZE(A) é 7245 ] ALLOCATED(SOURCE) - condição da alocação ] Usados para atribuir valores a conjuntos e seções. Por exemplo: IMPLICIT NONE INTEGER :: i INTEGER, DIMENSION(10) :: ints CHARACTER(len=5), DIMENSION(3):: colours REAL, DIMENSION(4) :: heights heights = (/5.10, 5.6, 4.0, 3.6/) colours = (/’RED ’,’GREEN’,’BLUE’/) ints = (/ 100,(i,i=1,8), 100/) ... 23 Montadores de conjunto (/.../) ] Montadores e seções de conjuntos precisam ser similares. ] Precisa ser 1D (unidimensional). ] Para ordens maiores, deve-se usar a função intrínseca RESHAPE ] (i, i=1,8) é um DO implícito e vale 1, 2, ..., 8. \ É possível especificar o passo. 24 Função intrínseca RESHAPE ] fornece um conjunto de forma especificada. RESHAPE(SOURCE,SHAPE) ] Exemplo: A=RESHAPE((/1,2,3,4/),(/2,2/)) A é preenchido por coluna 1 3 2 4 ] Visualização 1 2 3 4 1 3 2 4 Montador no comando de definição inicial 25 Conjuntos alocáveis ] O valor de um conjunto estabelecido no início INTEGER, DIMENSION(4):: vec=(/2,3,4,5/) CHARACTER(LEN=*), DIMENSION(3):: & luzes=(/’RED ’,’BLUE ’,’GREEN’/) e as cadeias devem ter o mesmo comprimento. ] Conjuntos constantes: INTEGER, DIMENSION(3), PARAMETER:: & VETOR_UNITARIO=(/1,1,1/) REAL, DIMENSION(3,3), PARAMETER:: & MATRIZ_UNITARIA= & RESHAPE((/1,0,0,0,1,0,0,0,1/),(/3,3/)) ] São conjuntos alocáveis aqueles cujos espaços são obtidos durante a execução do programa. ] São conhecidos como conjuntos de forma a definir (deferred-shape). \ Declaração e alocação: INTEGER, DIMENSION(:), ALLOCATABLE:: ages REAL, DIMENSION(:,:), ALLOCATABLE:: speed ... READ*,isize ALLOCATE(ages(isize),STAT=ierr) IF(ierr/=0) PRINT*,’Falha na alocação’ ALLOCATE(speed(0:isize-1,10),STAT=ierr) IF(ierr/=0) PRINT*,’Falha na alocação’ 27 Liberando espaços alocados ] A memória é devolvida com DEALLOCATE IF(ALLOCATED(ages)) & DEALLOCATE(ages,STAT=ierr) ] É errado liberar o espaço de um conjunto sem o atributo ALLOCATE, ou que não tenha sido previamente alocado. ] ALLOCATED é uma função intrínseca, escalar, lógica, sobre o status do conjunto. ] STAT é um campo opcional mas de uso recomendado. ] O encerramento de um procedimento sem a liberação de um conjunto alocável (sem o atributo SAVE), torna o espaço inacessível. 26 WHERE: atribuição sob máscara ] WHERE(I.NE.0) A=B/I ] O LE da atribuição e a máscara devem ser conjuntos e ambos junto com o LD da atribuição devem ser similares. Se, por exemplo, B igual a 1.0 2.0 I igual a 2 0 3.0 4.0 0 2 então A igual a 0.5 ? ? 2.0 \ somente os elementos indicados, correspondentes aos elementos não nulos de I, serão modificados. 28 29 Estrutura WHERE 30 Estrutura WHERE ] Estrutura em bloco para a atribuição sob máscara. WHERE(A>0.0) B=LOG(A) C=SQRT(A) ELSEWHERE B=0.0 ! C não é alterado ENDWHERE ] A similaridade deve ser satisfeita. ] WHERE e ENDWHERE não formam uma estrutura de controle e não podem ser embutidos. ] Seqüência de execução: avalia-se a máscara, executase o bloco WHERE (na sua totalidade), então executa-se o bloco ELSEWHERE. ] Os comandos de atribuição separados são executados em seqüência mas as atribuições elementares individuais dentro de cada comando são, por hipótese, executadas em paralelo. 31 Subscrito vetorial ] Um conjunto 1D (vetor) pode indexar uma dimensão de um conjunto. ] Assim, considerando INTEGER, DIMENSION(5):: v=(/1,4,8,12,10/) INTEGER, DIMENSION(3):: w=(/1,2,2/) \ A(v) refere-se a A(1), A(4), A(8), A(12) e A(10) ] São válidos A(v) = 3.5 C(1:3,1) = A(w) ] A(w) = ? é inválido pois A(2) tem dupla referência. ] Somente subscrito vetorial 1D é permitido: A(1) = SUM(C(v,w)) 32 Número aleatório intrínseco ] RANDOM_NUMBER(BICHO) retorna um escalar pseudo aleatório (ou um conjunto) no intervalo 0 ≤ x < 1. REAL :: bicho REAL, DIMENSION(10,10) :: bicharal CALL RANDOM_NUMBER(bicho) CALL RANDOM_NUMBER(bicharal) ] RANDOM_SEED([SIZE=<int>]) obtém o tamanho da semente. ] RANDOM_SEED([PUT=<conjunto>]) semeia o gerador de número aleatório. RANDOM_SEED(SIZE=isize) RANDOM_SEED(PUT=Iarr(1:isize)) 33 Multiplicações intrínsecas 34 Multiplicações intrínsecas ] Existem dois tipos de multiplicações de matrizes: ] Produto interno de dois conjuntos de ordem 1. dp=DOT_PRODUCT(a,b) equivalente a: dp=a(1)*b(1)+a(2)*b(2)+... Com conjuntos lógicos, a operação fica: dp=a(1) .and. b(1) .or. & a(2) .and. b(2) .or. ... ] Multiplicação tradicional de matrizes mat_c=MATMUL(mat_a,mat_b) \ Combinações quanto a forma mat_a mat_b (i,j) (j,k) (i) (i,j) (i,j) (j) (mat_c) (i,k) (j) (i) \ Com conjuntos lógicos, a operação correspondente passa a ser o .AND. 35 Máximo e mínimo intrínsecos ] Duas funções nesta classe: MAX(a1,a2[,a3[,...]]) máximo de todos objetos. MIN(a1,a2[,a3[,...]]) mínimo de todos objetos. A varredura procede da esquerda para a direita, sendo escolhido o primeiro em caso de duplicação. ] MAX(1,2,3) é 3 ] MIN((/1,2/),(/-3,4/)) é (/-3,2/) ] MAX((/1,2/),(/-3,4/)) é (/1,4/) 36 Posição em um conjunto ] Duas funções similares (retornam um vetor): MINLOC(A[,mask]) posição do valor mínimo em um conjunto A sob uma máscara. MAXLOC(A[,mask]) idem p/ o máximo. ] Dado a matriz M: 0 -1 1 6 -4 1 -2 5 4 -3 3 8 3 -7 0 MINLOC(M) é (/3,4/) MAXLOC(M, M<7) é (/1,4/) MAXLOC(MAXLOC(M, M<7)) é (/2/) Funções intrínsecas: redução de conjunto 37 ] SUM(A[,DIM][,MASK]) somatório de todos elementos (ao longo da dimensão especificada e sob a máscara informada). ] PRODUCT(A[,DIM][,MASK]) idem, produtório. ] Considerando a matriz M 1 3 5 2 4 6 PRODUCT(M) é 720 PRODUCT(M,DIM=1) é (/2,12,30/) PRODUCT(M,DIM=2) é (/15,48/) PRODUCT(M,DIM=1,MASK=M<=3) é (/2,3,1/) Funções intrínsecas: redução de conjunto ] MAXVAL(A,[,DIM][,MASK]) valor máximo em um conjunto (ao longo da dimensão especificada e sob a máscara informada). ] MINVAL(A,[,DIM][,MASK]) idem, valor mínimo. ] Ocorrendo a ausência de DIM ou se a ordem de A for 1 \ o resultado é um escalar, caso contrário a ordem do resultado é a ordem de A menos um. Funções intrínsecas: redução de conjunto 38 ] Operando com conjuntos, criam resultados de dimensões menores que o conjunto operado. ] ALL(mask[,DIM]) \ .true. se todos valores são .true. (ao longo da dimensão especificada). ] ANY(mask[,DIM]) \ .true. se qualquer valor for .true. (ao longo da dimensão especificada). ] COUNT(mask[,DIM]) \ número de valores .true. (ao longo da dimensão especificada). 39 40 FIM ] Fazer os exercícios.