O MATLAB (MATrix LABoratory) é um software interativo de alta performance voltado para o cálculo numérico. Programado a partir da linguagem C, o elemento básico de informação da linguagem MATLAB (ou M) é uma matriz que não requer dimensionamento. Possui versão de uso por linha de comando e por interface gráfica, que por sua vez é composta de janela de comandos (com o prompt ‘>>’, onde são digitados os comandos e impressa a saída), variáveis, histórico de comandos e edição de código.
Instalação
Estando de posse do CD (ou imagem ISO), arquivos de licença (license.lic e network.lic) e “installation key”, pode-se iniciar o processo de instalação:
1) Acessar o terminal do computador como super usuário (usando ssh com opção -X se for acesso remoto)
2) Montar a iso ou a mídia:
mkdir /media/temp mount lin_r2015a.iso /media/temp/
3) Ir para o diretório montado e executar o comando para iniciar a instalação como super usuário:
./install
4) Na janela que abriu, escolher “Use a file installation key” e clicar em “next”
5) Clique em “yes” para aceitar os termos e em “next”
6) Clique em “I have the File Installation Key for my license” e copie a chave (“installation key”)
7) Clique em next para aceitar o diretório padrão de instalação (/usr/local/MATLAB/R2015a)
8) Na tela de escolha de programas a serem instalados, escolher só o Matlab (a não ser que precise exatamente de algum outro)
9) Clique em “Browse” para encontrar o arquivo “license.lic” e clique em next
10) Clique em “Create symbolic links to MATLAB scripts in” e deixe o local padrão (/usr/local/bin)
11) Finalizada a instalação, deve-se acessar a pasta /matlab/licenses e remova o arquivo network.lic existente:
# rm /usr/local/MATLAB/R2015a/licenses/network.lic # cp /home/user/Matlab/network.lic /usr/local/MATLAB/R2015a/licenses/
Matlab no Linux
O comando “matlab” no terminal de texto do Linux abre o programa em modo gráfico – se estiver acessando um servidor remoto, utilize o parâmetro “-X” para permitir o modo gráfico. Caso prefira executar o modo texto do Matlab, basta acessar sem usar o “-X” ou usar os parâmetros indicados a seguir:
$ matlab -nojvm -nodisplay -nosplash < script.m
O redirecionamento após os três parâmetros é para o caso de executar um script Matlab via linha de comando. Nesse caso, escreva “exit” na última linha do script para ele retornar à linha de comando. Para evitar ficar abrindo e fechando o Matlab cada vez que for rodar o script, é possível abrir o terminal do Matlab em modo texto e executá-lo através do comando:
>> run script.m
Nesse caso, não coloque “exit” na última linha. Para alterar o arquivo de script, utilize algum editor em outra janela (gráfico ou texto puro).
Exemplos de scripts
As matrizes podem ter diferentes dimensões: Mx1 (ou 1xM), conhecidos como vetores pois possuem 1 coluna (ou 1 linha), MxN (2 dimensões), MxNxL (tridimensional), etc. Podem ser definidas separando os elementos de uma fila com espaço em branco ou usando vírgula e ponto-e-vírgula para terminar cada linha. A lista de elementos deve ser cercada por colchetes “[]”. Parênteses “()” são usados para acessar os elementos e subarrays (além de seu típico uso como entrada de argumento para funções).
Veja o exemplo a seguir (tiranan.m). Essa função que tem o objetivo de excluir o escrito “NaN” (Not a Number), que geralmente aparece quando não há dados válidos para serem armazenados. Nesse script, a função “tiranan” recebe um vetor (chamado “vetor” mesmo) e, enquanto o contador for menor ou igual ao tamanho (length) desse vetor, ela faz a verificação, elemento por elemento, se o valor é um NaN (função “isnan”). Se for um NaN (retorna verdadeiro, valor 1), essa posição do vetor é excluída e a posição dos elementos seguintes será diminuída em um. O vetor resultante retorna na variável “resultado”.
function resultado=tiranan(vetor) cont=1; while cont<=length(vetor) if isnan(vetor(cont))==1 vetor(cont)=[]; else cont=cont+1; end end resultado=vetor;
Veja esse outro exemplo (filtroeplota.m), que tem o objetivo de organizar dados, obtidos a partir de arquivos, em 3 colunas e impressão de histograma (linhas comentadas). O comando “load” salva os nomes dos arquivos (que estão no arquivo lista_aqua) em um “cell array”, que é uma matriz que pode guardar strings e números em uma mesma estrutura. Para cada um desses arquivos, serão contabilizados os dados com NaN e as linhas “zeradas” (sem dados), gravados os valores de ano e dia do ano (ANODIA), variável (AOD) e seu desvio padrão (s) em 3 colunas e impresso um gráfico contendo a série temporal desses dados. Nessa rotina temos exemplos de for, if/else, leitura de matrizes e plotagem de gráficos. A função “sprintf” escreve os dados em uma string, enquanto que a função “eval” executa a expressão inserida. Os comentários são iniciados com porcentagem “%” e comandos na mesma linha são separados por ponto e vírgula “;” (caso uma linha termine com esse caractere, sua saída não será impressa na tela).
warning off;clear all;clc; % desliga avisos;limpa variáveis;limpa tela load lista_aqua % chama listagem dos arquivos em cell array lista=lista_aqua; for i=1:length(lista) arquivo=char(lista(i)); matriz=load(arquivo); local=arquivo(1:3); ano=arquivo(4:7); sat=arquivo(17:17); raio=arquivo(18:19); statname=[local ano '_' sat raio]; tamanho=length(matriz); cont=0; n=1; diassemdados=0; diascomnuvens=0; %i=matriz(1,1) % primeira data %f=matriz(tamanho,1) % ultima data for cont=1:tamanho % cont eh o contador para varredura da matriz flag=isnan(matriz(cont,4)); % flag=1, entao eh NaN if flag==1 % possivel presença de nuvens diascomnuvens=diascomnuvens+1; end if (matriz(cont,1)~=0 & flag~=1) % linha zerada = sem dados DIA(n)=matriz(cont,2); AOD(n)=matriz(cont,6); % coluna 6 tem os valores de AOD em 550 nm s(n)=matriz(cont,5); n=n+1; %n eh o contador dos vetores x e y, soh atualiza se tiver dados end if matriz(cont,1)==0 % sem passagem diassemdados=diassemdados+1; end end % plotar serie temporal if strcmp(sat,'a')==1 titulo=sprintf('%s - %s - Aqua - raio %s - Serie Temporal',local,ano,raio) elseif strcmp(sat,'t')==1 titulo=sprintf('%s - %s - Terra - raio %s - Serie Temporal',local,ano,raio) end plot(DIA,AOD) errorbar(DIA,AOD,s,'b*') title(titulo) xlabel('dia do ano') ylabel('AOD') axis([0 367 0 5]); grid on; print('-dpng',arquivo); % titulohist=sprintf('%s - %s - raio %s - Histograma',local,ano,raio); % histname=[local ano '_hist_' raio]; % hist(AOD) % title(titulohist) % xlabel('AOD') % ylabel('Número de ocorrências') % axis([0 5 0 300]); % print('-dpng',histname); % gravar serie temporal temp(:,2)=DIA'; temp(:,3)=AOD'; temp(:,4)=s'; temp(:,1)=str2num(ano); % para unir ANO e DIA e formar coluna ANODIA (arquivo com 3 colunas) dados=[temp(:,1).*1000+temp(:,2) temp(:,3) temp(:,4)]; % Imprime as seguintes variáveis na tela diassemdados diascomnuvens diascomdados=n-1; diascomdados extras(i,1)=str2num([ano raio]); % converte string em número extras(i,2)=diassemdados; extras(i,3)=diascomnuvens; save(statname,'dados','-ASCII'); %save dias_semdados_comnuvens extras; %limpar variáveis para próxima rodada clear diassemdados diascomdados diascomnuvens flag tamanho n cont statname raio arquivo clear DIA AOD s local titulo ano dados matriz temp i=i+1; end
Na sequência, veja o gráfico gerado. A rotina apresentada foi uma das utilizadas para gerar os resultados apresentados no artigo: Estudo da variabilidade temporal da profundidade óptica do aerossol obtida com o MODIS sobre a região Amazônica.
Veja esse outro exemplo (geragraficos.m), também voltado para plotar gráficos de série temporal e de uma variável em função de outra. Os nomes das variáveis, sítios e satélites são dados em vetores de strings, e as informações de limites espaciais e temporais de cada sítio são determinados em vetores numéricos. Para cada satélite, em cada sítio e para cada ano, os respectivos arquivos com dados são lidos, os dados são selecionados espacialmente e são calculadas as médias a cada 15 dias. Também são impostas restrições para os dados e montados os vetores a serem plotados em dois gráficos: variável versus AOD e série temporal anual de cada variável. A função bins (utilizada ao montar a matriz de pontos a serem plotados) pode ser vista nesse link: bins.m
siglas={'LAT';'LON';'CFM';'CRL';'CEE';'CTP';'CTT';'CWM';'AWV';'AOD';'COL';'COI';'CFL';'LII'}; listaVAR={'AOD';'CF';'CTT';'CEE';'COD';'CER';'LWP';'LI';'AWV'}; sitios={'Amazonia';'AmazoniaOcidental';'Manaus';'Santarem';'RioBranco';'Rebio';'AltaFloresta'}; load('C:\le_hdf\aagraficos\mapa'); % arquivo .mat que tem tres variaveis: LAT, LON e permissions diretorioin='C:\le_hdf\IN\'; % se for mudar isso, olhar a variavel nome e suas consequencias!!! satelites={'AQUA' 'TERRA'}; Amazonia=[4 29 1 19 152 273]; % limites na tabela e da estacao do ano AmazoniaOcidental=[6 10 6 10 213 334]; Manaus=[12 16 6 10 152 273]; Santarem=[19 23 6 10 213 334]; RioBranco=[6 10 13 17 152 273]; Rebio=[12 16 13 17 152 273]; AltaFloresta=[19 23 13 17 152 273]; limtemp=[0 0 220 0.2 1 8 0 -8 1.5; 3 1 300 0.9 21 23 240 8 7]; limcorr=[0 0 270 0.2 1 6 0 -10 1.5; 3 1 310 0.9 21 23 220 8 7]; dry2wet=[250 300]; est={'Seca';'Transicao2'}; dry=2; %dry=1 seca / =2 dry2wet n=1; %%%%%%%%%%%%% parametros de entrada %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% for isat=1:length(satelites) sat=satelites{isat}; for isitio=1:length(sitios) for ano=2002:2008 disp(sprintf(' Trabalhando com os dados do ano %d, setor %s, satelite %s',ano,sitios{isitio},sat)) eval(sprintf('quadrado=%s;',sitios{isitio})); if dry==1 periodo=[quadrado(5) quadrado(6)]; else periodo=dry2wet; end if isitio==1 passo=50; else passo=30; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% rotina para abrir aquivo com dados if strcmp(sat,'AQUA')==1 for cod=3:length(siglas) nome=[diretorioin 'MYD3' num2str(ano) 'a_' siglas{cod}]; load(nome); variavel=nome(24:26); end else for cod=3:length(siglas) nome=[diretorioin 'MOD3' num2str(ano) 't_' siglas{cod}]; load(nome); variavel=nome(24:26); end end %% rotina para selecionar dados quanto ao espaço j=1; tamanho=size(VAR3); % 21 x 29 x 365 ou 366 for i=1:tamanho(3) jj=1; for x=1:tamanho(1) for y=1:tamanho(2) if x>=quadrado(1) & x<=quadrado(2) & y>=quadrado(3) & y<=quadrado(4) & permissions(x,y)~=4 & permissions(x,y)~=6 & permissions(x,y)~=2 dados(j,2)=VAR3(x,y,i); % CFM dados(j,6)=VAR4(x,y,i); % CRL dados(j,4)=VAR5(x,y,i); % CEE dados(j,3)=VAR7(x,y,i); % CTT dados(j,7)=VAR8(x,y,i); % CWM dados(j,9)=VAR9(x,y,i); % AWV dados(j,1)=VAR10(x,y,i); % AOD dados(j,5)=VAR11(x,y,i); % COL dados(j,8)=VAR14(x,y,i); % LII dados(j,10)=i; % DIA dados(j,11)=LAT(x,y); % LAT dados(j,12)=LON(x,y); % LON j=j+1; end % do if end % do y end % do x end % do i clear VAR3 VAR4 VAR5 VAR6 VAR7 VAR8 VAR9 VAR10 VAR11 VAR12 VAR13 VAR14 %%%%%%% Calcular media a cada 15 dias %%%%%%% cont=1;cont2=1;cont3=1;contsup=16;flag=0; while cont<size(dados,1) temp2(cont2,:)=dados(cont,:); cont2=cont2+1; if dados(cont,10)==contsup med15(cont3,:)=calcmed(temp2); clear temp2 cont3=cont3+1; cont2=1; contsup=contsup+15; end cont=cont+1; end medias{n}=med15; %%%%%% Restriçoes: apagar linhas de dados que nao interessam %%%%%%% cont=1; while cont<=size(dados,1)%length(vetor) if isnan(dados(cont,1))==1 | dados(cont,1)>0.8 | dados(cont,3)<273 | dados(cont,10)<periodo(1) | dados(cont,10)>periodo(2) dados(cont,:)=[]; else cont=cont+1; end end %%%%%%% Montar PONTOS{n} %%%%%%% ponto(:,1)=[-0.005 0.005 0.015 0.025 0.035 0.045 0.055 0.065 0.075 0.085 0.095 0.105 0.115 0.125 0.135 0.145 0.155 0.165 0.175 0.185 0.195 0.205 0.215 0.225 0.235 0.245 0.255 0.265 0.275 0.285 0.295 0.35 0.45 0.55 0.65 0.75]'; for isiglas=2:9 ponto(:,isiglas)=bins(dados(:,1),dados(:,isiglas)); end pontos{n}=ponto; %% limpar variaveis e atualizar contador geral n if cont2~=1 % se terminou cont2=1, entao limpou temp2 clear temp2 end clear med15 ponto dados n=n+1; end % do ano %%%%%%%%%%%%%%%%%%%%%%%%%%%% GRAFICOS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% nn=n-7; % VAR x AOD: plotar bins de varios anos num mesmo grafico for isiglas=2:9 titulo=sprintf('%s x AOD %s - %s - %s',listaVAR{isiglas},est{dry},sitios{isitio},sat); figname=sprintf('%sxAOD_%s%s%s',listaVAR{isiglas},sitios{isitio},est{dry},sat); plot(pontos{nn}(:,1),pontos{nn}(:,isiglas),'b*',pontos{nn+1}(:,1),pontos{nn+1}(:,isiglas),'g*',pontos{nn+2}(:,1),pontos{nn+2}(:,isiglas),'r*',pontos{nn+3}(:,1),pontos{nn+3}(:,isiglas),'c*',pontos{nn+4}(:,1),pontos{nn+4}(:,isiglas),'m*',pontos{nn+5}(:,1),pontos{nn+5}(:,isiglas),'y*',pontos{nn+6}(:,1),pontos{nn+6}(:,isiglas),'k*'); set(gca,'FontSize',16) legend('2002','2003','2004','2005','2006','2007','2008') set(gca,'FontSize',20) title(titulo) xlabel('AOD') if isiglas==3 legy=sprintf('%s (K)',listaVAR{isiglas}); elseif isiglas==6 legy=sprintf('%s (um)',listaVAR{isiglas}); elseif isiglas==7 legy=sprintf('%s (g/m^{2})',listaVAR{isiglas}); elseif isiglas==9 legy=sprintf('%s (cm)',listaVAR{isiglas}); else legy=listaVAR{isiglas}; end ylabel(legy) axis([0 0.8 limcorr(1,isiglas) limcorr(2,isiglas)]); grid on; print('-dpng',figname); close end % Serie temporal: plotar medias 15 dias de varios anos num mesmo grafico for isiglas=1:9 titulo=sprintf('%s - series temporais %s %s',listaVAR{isiglas},sitios{isitio},sat); figname=sprintf('%s_%s%sanos',listaVAR{isiglas},sitios{isitio},sat); plot(medias{nn}(:,10),medias{nn}(:,isiglas),'b-*',medias{nn+1}(:,10),medias{nn+1}(:,isiglas),'g-*',medias{nn+2}(:,10),medias{nn+2}(:,isiglas),'r-*',medias{nn+3}(:,10),medias{nn+3}(:,isiglas),'c-*',medias{nn+4}(:,10),medias{nn+4}(:,isiglas),'m-*',medias{nn+5}(:,10),medias{nn+5}(:,isiglas),'y-*',medias{nn+6}(:,10),medias{nn+6}(:,isiglas),'k-*'); set(gca,'FontSize',15) if isiglas==2|isiglas==4|isiglas==6|isiglas==9 legend('2002','2003','2004','2005','2006','2007','2008',4) else legend('2002','2003','2004','2005','2006','2007','2008') end set(gca,'FontSize',18) title(titulo) xlabel('dia do ano') if isiglas==3 legy=sprintf('%s (K)',listaVAR{isiglas}); elseif isiglas==6 legy=sprintf('%s (um)',listaVAR{isiglas}); elseif isiglas==7 legy=sprintf('%s (g/m^{2})',listaVAR{isiglas}); elseif isiglas==9 legy=sprintf('%s (cm)',listaVAR{isiglas}); else legy=listaVAR{isiglas}; end ylabel(legy) axis([0 400 limtemp(1,isiglas) limtemp(2,isiglas)]); grid on; print('-dpng',figname); close end end % do sitio end % do sat
Na sequência, veja um exemplo dos gráficos gerados por esse script. Mais exemplos podem ser visto nessa dissertação: Análise de propriedades de nuvens em função da profundidade óptica do aerossol a partir de produtos derivados pelo MODIS da região amazônica durante a estação seca
Finalizando, uma função muito útil desliga o computador após um certo número de segundos (shutdown.m):
% shutdown % turn off the computer in 60 seconds % shutdown(numsec) % turn off the computer in numsec seconds % shutdown(-1) % abort the shutdown; don't turn off the computer function shutdown(varargin) if nargin if isnumeric(varargin{1}) if varargin{1} == -1 evalc('!shutdown -a'); return end t = ceil(varargin{1}); else t = 60; end else t = 60; end eval(['!shutdown -s -f -t ' num2str(t)])
Para um tutorial mais completo, existem vários disponíveis em português na web, como essa Apostila de MATLAB do link.
Uma alternativa opensource gratuita ao MATLAB, com alto grau de compatibilidade entre funções e scripts, é o Octave – clique no link para conhecê-lo melhor.
One comment