E ai galera!
Estou de volta com este post sobre um assunto que mudou a minha forma de escrever scripts no Matlab.
Para quem trabalha com matrizes de grande tamanho, como os que trabalhamos com sensoriamento remoto, esperar muito tempo para que uma script termine de rodar é uma coisa rotineira. Mas o pior dos casos é quando vemos o erro de OUT OF MEMORY e somos forçados a rodar o script por partes.
Muitas vezes estes inconvenientes ocorrem porque nosso script é ineficiente no uso da memória.
Para melhorar os nossos scripts devemos seguir 3 regras simples:
1. Pré-alocar variáveis antes de acessar elas dentro de loops (for)
É mais rápido introduzir valores em uma matriz já existente do que mudar o tamanho da matriz a cada passo do loop. Se a saída do seu loop (A) crie uma matriz vazia do tamanho final desta variável, usando a função nan ou zeros, antes do loop. Por exemplo:
A=nans(1,5000);%pre-alocando
for i=1:4999
A(i)=2*(i-1);%valor para cada posição
end
2. Salve e acesse os dados em colunas
Quando trabalhando com matrizes 2-D sempre acesse os dados em colunas, ou no caso de matrizes de mais dimensões, pela última dimensão. Ou seja, se você for fazer um loop, faça o primeiro for correspondente às colunas e o segundo correspondente às filas.
A=nans(2000,5000); %pre-alocando
for i=1:4999 % colunas
for j=1:1999 % linhas
A(j,i)=2*(i-1)*(j-1);%valor para cada posição
end
end
3. Evite criar variáveis inecessárias
Esse é o erro mais comum do usuário inexperiente do matlab, a gente vai criando matrizes que são intermediárias no processamento dos dados, que não vamos usar nunca mais, mas ela vai ficando lá, consumindo memória. Então ao invés de fazer códigos do tipo:
A=linspace(1,30,1000); % cria um vetor de 1000 elementos entre 1 e 30
B=2.*A; % calcula o valor desejado mediante outra operação
faça
B=2.*linspace(1,30,1000); % faz as duas coisas ao mesmo tempo e em uma única variável
Isto parece trivial, mas é importante quando trabalhamos com matrizes grandes.
Estas dicas foram extraídas de http://www.eetimes.com/design/memory-design/4017527/Speed-MATLAB-by-optimizing-memory-access, link que um companheiro de laboratório encaminhou pra mim há muito tempo atrás (a data do artigo é de 2007). Sugiro que vocês visitem o link para ver exemplos que mostram o aumento da velocidade de processamento mediante a comparação de scripts.
Apliquem as regras, rapidez garantida!
Até a próxima! :)
Nenhum comentário:
Postar um comentário