MATLAB

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.

Tela do programa MATLAB (v. 7.4)
Tela do programa MATLAB (v. 7.4)

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.

Gráfico de série temporal gerado pela rotina
Gráfico de série temporal gerado pela rotina “filtroeplota.m”

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

Gráficos de variável versus AOD e de série temporal anual gerados pela rotina
Gráficos de variável versus AOD e de série temporal anual gerados pela rotina “geragraficos.m”

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

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.