Conjunto de dados - CPGG-UFBA

Сomentários

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.