Neste exemplo, faremos um vídeo AVI contendo as anomalias mensais de temperatura, usando dados de Reynolds et al, disponíveis gratuitamente na internet.
Neste exemplo, os dados já foram previamente organizados em matrizes anuais e estão salvos com nomes do tipo sst2008.mat, que quando carregados trazem matrizes do tipo:
sst2008(latitude, longitude, mes);
close all; clear all; clc;
Primeiro especifica-se com quais anos trabalharemos e pré-alocamos a matriz para melhorar o desempenho do código.
% Quais anos serão incluidos no vídeo anos = 1982:2007; % Quantos meses serão contados qtd_mes = length(anos) * 12; % estrutura da matriz soma e média: % - linhas: latitude % - colunas: longitude % - páginas: mês soma = zeros(180, 360, 12);
Primeiro somaremos todos os janeiros, todos os fevereiros e assim sucessivamente. Para isso, será usado um for, que deve ser evitado, mas, aqui, não vi melhor opção.
Apesar de termos pré-alocado a matriz, pode ser que o código demore um pouco para ser executado, então adicionaremos uma barra de progresso para indicar o andamento.
ah = waitbar(0, ... 'Aguarde enquanto enquanto a soma é calculada.');
Agora fazemos a soma.
AVISO: este artigo foi escrito em uma época em que eu não sabia MATLAB direito. Utilizar a função eval para abrir um arquivo (como feito abaixo) é uma vergonha. O correto é utilizar matriz = load(['sst', num2str(anos(i))]);.
for i=1:length(anos) % para todos os anos % Carrega cada um dos arquivos anuais de SST cmd = ['load sst', num2str(anos(i)),'; matriz = sst', ... num2str(anos(i)),';']; eval(cmd); % soma mês média... soma = soma + matriz; % Atualiza a barra de progresso waitbar(i / length(anos)); end; % Fecha a barra de progresso close(ah);
A matriz media receberá as médias (óbvio, não?)
media = soma / length(anos);
Para fazer o vídeo, primeiro iniciamos o arquivo usando a função avifile. Eu passei como parâmetro fps o valor 10, pois quero 10 quadros por segundo.
aviobj = avifile('anima-anomalia.avi', 'fps', 10);
Agora temos mais um for que criará cada um dos quadros do vídeo e também adicionará cada quadro ao arquivo.
for i=1:length(anos) cmd = ['load sst', num2str(anos(i)),'; matriz = sst', ... num2str(anos(i)),';']; eval(cmd); % Anomalia = mês - média anomalia = matriz - media; for j=1:12 imagesc(anomalia(:,:,j)); axis ('xy', 'equal', 'tight'); caxis([-5 5]); colorbar vert; text(170,10, ... datestr([anos(i) j 1 0 0 0], 'mmm - yyyy'),... 'color', 'w', 'backgroundcolor', 'k'); set(gcf, 'color', 'w'); aviobj = addframe(aviobj, getframe); end; end;
Agora basta finalizar o arquivo e o vídeo será criado.
aviobj = close (aviobj);