Sie sind auf Seite 1von 16

Universidade de São Paulo Instituto de Astronomia, Geofísica e Ciências Atmosféricas Departamento de Ciências Atmosféricas

Matlab:

Matrizes Multidimensionais e

Dados do NETCDF

Elaborado por: Michelle S. Reboita 10 de julho de 2005

2

Introdução

Este manual foi desenvolvido para auxiliar os usuários do Matlab a lidar com os dados no formato NETCDF. O mesmo encontra-se em fase inicial, mas já possui um bom material que inclui desde o procedimento de instalação dos toolboxes necessários para o trabalho com dados NETCDF, bem como exemplos de como carregar este tipo de dado e a construção de mapas. O manual está dividido em três partes: a primeira mostra onde obter e como instalar os toolboxes necessários para trabalhar com os dados NETCDF, a segunda traz uma explicação de como são representadas as matrizes multidimensionais no Matlab e a terceira apresenta os procedimentos necessários para carregar os dados NETCDF e para a elaboração de mapas. Aos usuários desta apostila pede-se que sejam dados os créditos a Michelle S. Reboita. Também solicita-se sugestões para o melhoramento da mesma que podem ser enviadas para reboita@model.iag.usp.br.

Sumário

1 Abrindo os dados NETCF no Matlab

3

1.1

Instalação

3

2 Matrizes Multidimensionais no Matlab

4

2.1 Construção de Uma Matriz Multidimensional

4

2.2 Dimensões da Matriz

5

2.3 Usando as Funções: zeros, ones

5

2.4 Função squeeze

5

2.5 Função permute

6

2.6 Médias: mean ou nanmean

7

2.7 Função contour

8

2.8 Figuras Diferentes na Mesma Escala de Cor

10

2.9 Gráficos de Campo Vetorial

11

2.10 Salvando Figuras na Linha de Comando

13

3 Carregando Dados NETCDF

14

3.1 Carregando o Arquivo

14

3.2 Construindo Mapas

15

Elaborado por: Michelle S. Reboita

10/07/2005

3

1

Abrindo os dados NETCF no Matlab

1.1

Instalação

a. Obter os pacotes mexcdf53_pcwin, netcdf_install e matlab_netcdf_5_0.

Os dois primeiros são obtidos em:

http://woodshole.er.usgs.gov/staffpages/cdenham/public_html/MexCDF/nc4ml5.html

e o terceiro em:

http://www.marine.csiro.au/sw/matlab-netcdf.html

b. Colocá-los dentro do toolbox do Matlab.

c. Criar três pastas denominadas: mexcdf53_pcwin, netcdf e matlab_netcdf_5_0 no toolbox

do Matlab e colocá-las no Path.

d. Verificar se o diretório atual é o toolbox.

e. Executar na janela de comandos mexcdf53_pcwin_install e seguir as instruções que

aparecem na tela.

f. Executar na janela de comandos netcdf_install e seguir as instruções que aparecem na tela,

que incluem colocar no path o diretório netcdf.

g. Certificar-se que o path conhece o mexcdf53

h. Reiniciar o Matlab

i. Executar: rehash toolboxcache e tnetcdf

O tnetcdf abre uma interface gráfica.

j. Reiniciar o matlab

k. Executar matlab_netcdf_5_0

Obs: Caso este pacote não se instale automaticamente ir em:

http://www.nersc.no/~even/matlab/toolbox/matlab_netcdf_5_0/

e copiar os programas para dentro da pasta matlab_netcdf_5_0 no toolbox.

Com isso você está apto a abrir arquivos .nc no Matlab.

Elaborado por: Michelle S. Reboita

10/07/2005

4

2 Matrizes Multidimensionais no Matlab

No help do Matlab há explicações sobre este tópico. O caminho é Programming – Data Structure – Multidimensional Arrays.

O Matlab entende as matrizes multidimensionais como

var(linhas, colunas, dimensão, dimensão,

)

como var(linhas, colunas, dimensão, dimensão, ) 2.1 Construção de Uma Matriz Multidimensional a=[5 7 8; 0

2.1 Construção de Uma Matriz Multidimensional

a=[5 7 8; 0 1 9;4 3 6];

a(:,:,2)=[1 4 0; 3 5 6; 9 8 7];

a(:,:,1) =

5

0

4

7

1

3

8

9

6

a(:,:,2) =

1

3

9

4

5

8

0

6

7

Elaborado por: Michelle S. Reboita

10/07/2005

5

2.2 Dimensões da Matriz

Para obter-se as dimensões da matriz a utiliza-se:

size(a)

ans =

3 3

2

2.3 Usando as Funções: zeros, ones

b=zeros(4,3,2)

 

b(:,:,1) =

 

b(:,:,2) =

 

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

d=ones(4,3,2)

 

d(:,:,1) =

 

d(:,:,2) =

 

1 1

1

1 1

1

1 1

1

1 1

1

1 1

1

1 1

1

1 1

1

1 1

1

2.4 Função squeeze

A função squeeze é usada para remover dimensões da matriz.

y(:,:,1) =

y(:,:,2) =

y(:,:,3) =

0.5194

0.0346

0.5297

0.831

0.0535

0.9711

Elaborado por: Michelle S. Reboita

10/07/2005

6

Z

= squeeze(y)

Z

=

0.5194

0.0346

0.5297

0.831

0.0535

0.9711

size(Z)

ans =

2 3

2.5 Função permute

A função permute troca a ordem das dimensões da matriz.

a(:,:,1,1) =

a(:,:,1,2) =

1 2

3

3

3

3

1 2

3

1

1

1

1 2

3

3

3

3

1 2

3

1

1

1

size(a)

ans =

4

3

1

2

b=permute(var,[dimensão])

b=permute(a,[2 4 3 1])

[2 4 3 1] = Neste exemplo, a segunda dimensão passa a ser a primeira, a quarta passa a ser a segunda, a terceira não modifica-se e a primeira passa a ser a quarta.

Elaborado por: Michelle S. Reboita

10/07/2005

7

b(:,:,1,1) =

3

2 3

3

3

1

b(:,:,1,2) =

1

2 1

1

size(b)

ans =

3

1

b(:,:,1,3) =

3

2 3

3

3

1

b(:,:,1,4) =

1

2 1

3

1

1

4

3

2.6

1 b(:,:,1,3) = 3 2 3 3 3 1 b(:,:,1,4) = 1 2 1 3 1

Médias: mean ou nanmean

nanmean usada quando há NAN

Elaborado por: Michelle S. Reboita

10/07/2005

2

1

8

aa(:,:,1) =

aa(:,:,2) =

aa(:,:,3) =

3

2

1

6

3 4

NaN

2

1

6

5

NaN

4 NaN

5

3 2

2

3

4

5

1

1 1

1 1

1

aa2=nanmean(var,dimensão)

aa2=nanmean(aa,3)

aa2 =

3

3.3333

2

4.3333

4

2

1.6667

2

2.3333

Especificando o tempo desejado

aa2=nanmean(aa(:,:,1:2),3)

aa2 =

 

3

4

2.5

5

5

NaN

2

2.5

3

2.7

Função contour

Para plotar todas as linhas e colunas do tempo três da matriz aa:

contourf(aa(:,:,3))

Observa-se que no tempo três não havia um dado, sendo o mesmo representado por NaN. Mas o contour consegue plotar mesmo com a presença do NAN.

Para colocar o valor nas linhas de contorno fazer:

[c,h]=contourf(aa(:,:,3));

h=clabel(c,h); set(h,'BackgroundColor',[1 1 .6])

3 2 1 1 1.2 1.4 1.6 1.8 2 2.2 2.4 2.6 2.8 3
3
2
1
1
1.2
1.4
1.6
1.8
2
2.2
2.4
2.6
2.8
3

2.8

2.6

2.4

2.2

1.8

1.6

1.4

1.2

Elaborado por: Michelle S. Reboita

10/07/2005

9

3 1.2 1.2 1.4 2.8 1.2 1.6 1.6 1.8 1.8 2.6 1.4 1.4 2 2.2
3
1.2
1.2
1.4
2.8
1.2
1.6
1.6
1.8
1.8
2.6
1.4
1.4
2
2.2
2
2.4
2.4
1.6
2.6
2.2
1.8
2
2.6
2.2 2.4
2
2
1.8
2.8
1.6
1.6
2
1.2
1.4
1.8
1.6
2
1.2
1.4
1.8
1.4
1.2
1
1
1.2
1.4
1.6
1.8
2
2.2
2.4
2.6
2.8
3
Para não aparecer a caixinha amarela em volta dos valores não usar:
2
2
1.8
1.6
1.4
1.2
2.2

set(h,'BackgroundColor',[1 1 .6])

Para aumentar a fonte dos valores, mudar a cor e a orientação dos mesmos:

clabel(c,h, 'FontSize', tamanho, 'color', 'cor', 'Rotation', rotação)

As cores podem ser:

b

blue

g

green

r

red

c

cyan

m

magenta

y

yellow

k

black

A rotação pode ser 0 (zero) que indica nenhuma rotação.

Outro exemplo:

[x,y] = meshgrid(-1:.01:1); z = x.*exp(-x.^2-y.^2);; [c,h]=contour(x,y,z);

Elaborado por: Michelle S. Reboita

10/07/2005

10

h = clabel(c,h); set(h,'BackgroundColor',[1 1 .6])

2.8 Figuras Diferentes na Mesma Escala de Cor

Para deixar diferentes figuras na mesma escala de cor:

a) encontrar o menor e o maior valor dos diferentes conjuntos de dados. Para tanto usa-se:

valormínimo = min(variável) valormáximo = max(variável).

b) antes do comando plote usar: caxis([valormínimo valormáximo])

Exemplo

1. Criando o conjunto de dados

a(:,:,1) = [3

2

3

1

2

5];

a(:,:,2) = [6

7

9

5

4

3];

2. Plotando a figura

contourf(a(:,:,1))

title('Figura 1') colormap(gray) colorbar figure

contourf(a(:,:,2))

title('Figura 2') colormap(gray) colorbar

Figura 1

2 4 3 2 1
2
4
3
2
1

1.9

1.8

1.7

1.6

1.5

1.4

1.3

1.2

1.1

3.5

2.5

1.5

1

1.2

1.4

1.6

1.8

2

2.2

2.4

2.6

2.8

3

Figura 2

2 7 6 5 4 1
2
7
6
5
4
1

1.9

1.8

1.7

1.6

1.5

1.4

1.3

1.2

1.1

7.5

6.5

5.5

4.5

3.5

1

1.2

1.4

1.6

1.8

2

2.2

2.4

2.6

2.8

3

3. Verificar os valores mínimos e máximos de cada figura

min(min(a(:,:,1)))

ans =

1

min(min(a(:,:,2)))

ans =

3

max(max(a(:,:,1)))

Elaborado por: Michelle S. Reboita

10/07/2005

11

ans =

5

max(max(a(:,:,2)))

ans =

9

Então para cada figura deve-se fazer:

caxis[(min max]) colorbar

%Figura 1

caxis[min max]

colorbar

%Figura 2

caxis([0 10])

colorbar

Figura 1

2 9 8 7 6 5 4 3 2 1 1
2
9
8
7
6
5
4
3
2
1
1

1.9

1.8

1.7

1.6

1.5

1.4

1.3

1.2

1.1

1

1.2

1.4

1.6

1.8

2

2.2

2.4

2.6

2.8

3

2.9 Gráficos de Campo Vetorial

Figura 2

2 9 8 7 6 5 4 3 2 1 1
2
9
8
7
6
5
4
3
2
1
1

1.9

1.8

1.7

1.6

1.5

1.4

1.3

1.2

1.1

1

1.2

1.4

1.6

1.8

2

2.2

2.4

2.6

2.8

3

[x,y]= meshgrid(-5:1:5)

% Constrói a grade

u=2*(x.^2)+2*x-4*y

% Componente zonal

v=-2*x.*y-2.*y

% Componente meridional

quiver(x,y,u,v)

figure [li, ar] = streamslice(x, y, u, v) streamline([li ar])

% Abre uma nova janela de figura % Faz linhas de corrente

Elaborado por: Michelle S. Reboita

10/07/2005

12

Obs: se no gráfico das linhas de corrente não aparecer os eixos da direita e superior da figura ir na barra de menu, clicar em edit axis properties style axis box on.

6 4 2 0 -2 -4 -6 -6 -4 -2 0 2 4 6
6
4
2
0
-2
-4
-6
-6
-4
-2
0
2
4
6

Linhas de Corrente

5 4 3 2 1 0 -1 -2 -3 -4 -5 -5 -4 -3 -2
5
4
3
2
1
0
-1
-2
-3
-4
-5
-5
-4
-3
-2
-1
0
1
2
3
4
5

Elaborado por: Michelle S. Reboita

10/07/2005

13

2.10 Salvando Figuras na Linha de Comando

help saveas SAVEAS Save Figure or model to desired output format. SAVEAS(H,'FILENAME') Will save the Figure or model with handle H to file called FILENAME. The format of the file is determined from the extension of FILENAME.

SAVEAS(H,'FILENAME','FORMAT') Will save the Figure or model with handle H to file called FILENAME. in the format specified by FORMAT. FORMAT can be the same values as extensions of FILENAME. The FILENAME extension does not have to be the same as FORMAT. Given FORMAT overrides FILENAME extension. Valid options for FORMAT are:

'fig' - save figure to a single binary FIG-file. Reload using OPEN. 'm' - save figure to binary FIG-file, and produce callable M-file for reload. 'mfig' - same as M. 'mmat' - save figure to callable M-file as series of creation commands with param-value pair arguments. Large data is saved to MAT-file. Note: MMAT Does not support some newer graphics features. Use this format only when code inspection is the primary goal. FIG-files support all features, and load more quickly.

Allowable options also include devices allowed by PRINT.

Examples:

Write current figure to MATLAB fig file

saveas(gcf, 'output', 'fig')

Write current figure to windows bitmap file

saveas(gcf, 'output', 'bmp')

See Also LOAD, SAVE, OPEN, PRINT

Elaborado por: Michelle S. Reboita

10/07/2005

14

3 Carregando Dados NETCDF

Para o Matlab

var(linha, coluna, tempo)

Dados abertos pelo pacote netcdf

var(tempo, linhas, colunas)

sendo que considera as linhas como as latitudes e as colunas como as longitudes.

3.1 Carregando o Arquivo

t=getnc('nome do arquivo','nome da variável');

Exemplo:

t=getnc('WHOI.lhtfl.1997','lhtfl');

É necessário saber previamente o nome da variável que está contida no arquivo. Esta informação é obtida no local de origem dos dados. Os arquivos abertos pelo getnc não incluem os vetores de latitude, longitude e tempo, portanto usamos também o ncload. Entretanto, se a função getnc não funionar usar as funções ncload e o netcdf e a expressão da linha que inicia com a palavra fluxo para carregar os dados. O getnc é melhor porque coloca NAN nos valores faltantes.

Carregando os arquivos NETCDF com lat, lon, tempo e variáveis

t1=ncload('WHOI.lhtfl.1997.nc');

Para obter os valores corrigidos da variável executa-se a linha abaixo, o primeiro argumento é o nome do conjunto de dados.

nc1=netcdf('WHOI.lhtfl.1997.nc','nowrite')

fluxo=nc1{'lhtfl'}(:,365,:,:)*nc1{'lhtfl'}.scale_factor(:)+nc1{'lhtfl'}.add_offset(:)

lhtfl é o nome da variável 365 é o tempo escolhido se quero todos os tempos é : (dois pontos)

O netcdf abre os dados como var(tempo, lat, lon), mas para o Matlab devemos ter var(lon, lat, tempo), assim vamos usar a função permute para deixar os dados na forma que o

Elaborado por: Michelle S. Reboita

10/07/2005

15

Matlab entende. Além disso, vamos colocar a longitude na primeira dimensão (componente i)

e a latitude na segunda (componente j).

tt2=permute(t,[3 2 1]);

3.2 Construindo Mapas

Para isso é necessário o pacote m_map disponível em:

http://www2.ocgy.ubc.ca/~rich/map.html

e os dados de linha costeira do globo disponíveis ftp://ftp.ngdc.noaa.goc/MGG/shorelines/

%Definindo a projeção e as dimensões da lon e lat m_proj( 'mercator','lon<gitude>', [259.5 385.5],'lat<itude>',[-64.5 64.5])

%Como o vetor de longitude variava de -180 a 180 somei 360 para variar de 0 a 360, que é a forma utilizada pelo m_proj

lon2=lon+360;

%Plota o mapa

m_contourf(lon2,lat,tt2(:,:,1)')

%Plota a linha de costa m_coast('patch',[.7 .7 .7],'edgecolor','none'); %Neste caso o continente é preenchido pela cor cinza. Para sair apenas a linha de costa: m_coast(‘line’)

%Plota as linhas de grade

m_grid('box','fancy','tickdir','out')

colorbar

%Exemplo de um mapa para o Atlântico Sul m_proj( 'mercator','lon<gitude>', [279.5 375.5],'lat<itude>',[-60.5 0.5])

lon2=lon+360;

lon2=lon2(21:117);

lat2=lat(5:66);

m_contourf(lon2,lat2,tt3(:,:,1)')

m_coast('patch',[.7 .7 .7],'edgecolor','none'); m_grid('box','fancy','tickdir','out')

colorbar

Elaborado por: Michelle S. Reboita

10/07/2005

16

Tempo = 1 - Atlântico Sul

50

o

N

25

o

N

0 o

25

o

S

50

o

S

Fluxos t=1

- Atlântico Sul 50 o N 25 o N 0 o 25 o S 50 o

85 o W

60 o W

35 o W

10 o W

15 o E

-50

-100

-150

-200

-250

-300

-350

-400

10 o W 15 o E -50 -100 -150 -200 -250 -300 -350 -400 0 o

0 o

12

o

S

24

o

S

36

o

S

48

o

S

60

o S 80 o W

60 o W

40 o W

20 o W

0 o

-50

-100

-150

-200

-250

Elaborado por: Michelle S. Reboita

10/07/2005