[R-br] Ajuda com função

Fabio Mathias Corrêa fabio.ufla em yahoo.com.br
Quarta Agosto 22 03:22:05 BRT 2012


Olá Clara,

Construi uma função em Fortran que acredito que vai ajudar.

Simulei em uma matrix de 100 x 100 com aproximadamente 5000 CF e demorou 
5 seg.

A função só funciona em SO linux.

Pode ser?


Valeu!
 
        Fábio Mathias Corrêa


   Universidade Estadual de Santa Cruz
Departamento de Ciências Exatas e da Terra - DCET


Campus Soane Nazaré de Andrade, km 16 Rodovia Ilhéus-Itabuna
CEP 45662-900. Ilhéus-Bahia


Tel.: 73-3680-5076


________________________________
 De: clara luz <clara_santanna em yahoo.com.br>
Para: "r-br em listas.c3sl.ufpr.br" <r-br em listas.c3sl.ufpr.br> 
Enviadas: Terça-feira, 21 de Agosto de 2012 21:35
Assunto: [R-br] Ajuda com função
 

Olá grupo!
 
Estou trabalhando em uma função, mas sou uma iniciante no R, se vcs puderem me dar dicas sobre como torna-lá mais rápida ou simples, seria ótimo!!
 
A função visa alocar diferentes valores ao redor de uma célula focal pertencente a uma matriz, ou seja, a partir de uma célula focal, preencher os vizinhos primários (os 8 vizinhos mais próximos), secundários (os próximos 16 vizinhos ao redor), e assim por diante, com diferentes valores de uma função.
 
aloj<-read.table("2012_aloj.txt") #matriz de '0' e '1', cada '1' será minha célula focal (CF)
 
ep<-expand.grid(1:nrow(aloj),1:ncol(aloj)) #função do R que expande uma matriz, gera nova matriz de 2 colunas, mostrando pra cada célula sua posição x na col 1 e y na col 2

gram<-which(aloj==1,arr.ind = TRUE) #encontra '1's, seleciona as células  focais (CFs), suas posições em uma nova matriz 'gram'
 
pbtp<-array(0,dim=c(nrow(aloj),ncol(aloj),nrow(gram))) # array de 3 dimensões onde serão guardadas os valores dos vizinhos de cada célula focal (VZ), cada matriz é referente a uma CF, uma célula com '1', no exemplo são cerca de 250 CFs e 250 matrizes
  
for (k in 1:nrow(gram)) {   # analisa cada CF, cada 'k' é referente a uma CF, no caso cerca de 250 'k's
   x<-gram[k,1]  
   y<-gram[k,2]    # x,y é a posição da CF na matriz 'aloj'
   ps<-numeric(d)    #criar um vetor temporário para alocar os valores gerados no 'for p', valores que serão alocados nos vizinhos, um valor pra VZ primário (VZ1), outro pra secundário (VZ2). 
   #d é um argumento variável, pode ser d<-5
  
   for(p in 1:d){  # dentro do for k, para gerar os valores dos VZ 
      ps[p]<-2.718^(-(0.1*p)) #calcula o valor pra cada cél viz, cada 'p' gera um 'ps', esse 'ps' será o valor dos VZ, sendo que ps1=>VZ1, ps2=>VZ2,...
        #meu problema maior está aqui, a idéia é colocar cada valor ps[p] no seu local adequado (ps1=>VZ1, ps2=>VZ2,...)
      s<-which(ep[,1]>(x-(p+0.1)) & ep[,1]<(x+(p+0.1)) & ep[,2]>(y-(p+0.1)) & ep[,2]<(y+(p+0.1))) # s é um vetor que seleciona as células ao redor da minha CF, para p=1 encontra os VZ1, porém para p=2 encontra os VZ2 e também os VZ1, ele seleciona todo o intervalo...
          #cada 'p' gera um 's' diferente, p=1, 's' com 9 elementos (8 VZ1 e 1 CF), p=2, 's' com 25 elementos (16 VZ2, 8 VZ1 e 1 CF)....
          
      for (n in 1:length(s)){ #dentro do for p, para colocar os valores ps[d] nos VZ certos
        v<-ep[s[n],]      
        t<-pbtp[v[1,1],v[1,2],k]
        if(t==0){   #só analisa as células com '0'
          pbtp[v[1,1],v[1,2],k]<-ps[p]
          } # fecha if
      } #fecha for n
   } #fecha for p  
} #fecha for k
 
Até funciona, mas está muito lento, para o exemplo acima, com 250 CF, são cerca de 30s, mas vou usar isso para até 20.000 CF... se alguém souber como tornar a função mais eficiente, seria ótimo, ou mesmo indicar alguma função do R mesmo que já faça isso.
Aloj em anexo. 
 
Valeu galera!!
 
Clara Luz B. Sant'Anna
Bióloga, Bacharel e Licenciada
Mestranda em Ecologia - Unicamp
Laboratório de Biogeografia da Conservação e Mudanças Climáticas- UFG
(19) 9233.1062
_______________________________________________
R-br mailing list
R-br em listas.c3sl.ufpr.br
https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20120821/20964717/attachment.html>


Mais detalhes sobre a lista de discussão R-br