[R-br] Junção de dados no mclapply

Benilton Carvalho beniltoncarvalho em gmail.com
Sexta Dezembro 21 12:16:03 BRST 2012


conforme ja explicado... agora em 2 versoes:

grid <- expand.grid(i=1:ncol(m2), j=1:nrow(m1))

## versao 1
f <- function(idx)
   m1[grid[idx, 2],] %*% m2[, grid[idx, 1]]
matrix(unlist(mclapply(1:nrow(grid), f)), nc=ncol(m2), byrow=T)

## versao 2
g <- function(idx){
aux = 0
X = m1[grid[idx, 2], ]
Y = m2[, grid[idx, 1]]
for (i in 1:length(X))
aux = aux + X[i]*Y[i]
aux
}

matrix(unlist(mclapply(1:nrow(grid), g)), nc=ncol(m2), byrow=TRUE)


2012/12/21 Junior Beleti <beleti.junior em gmail.com>:
> Bom dia a todos.
>
> Estou realizando experimentos para execução paralela. Para isso criei uma
> função que realiza a multiplicação de matrizes na sua forma digamos
> "primitiva", ou seja, como na matemática mesmo, realizando a multiplicação
> linha por coluna.
>
> Sei que existe o operador %*% que já realiza a multiplicação matricial,
> porém, como já disse antes, estou apenas realizando experimentos.
>
> Segue código:
>
> m1 <- matrix(0,3,3) #criando matriz
> m1[1,1]<-1
> m1[1,2]<-2
> m1[1,3]<-3
> m1[2,1]<-4
> m1[2,2]<-1
> m1[2,3]<-4
> m1[3,1]<-2
> m1[3,2]<-3
> m1[3,3]<-2
> m2 <- matrix(0,3,3) #criando matriz
> m2[1,1]<-2
> m2[1,2]<-1
> m2[1,3]<-2
> m2[2,1]<-3
> m2[2,2]<-4
> m2[2,3]<-1
> m2[3,1]<-2
> m2[3,2]<-3
> m2[3,3]<-3
> m3 <- matrix(0,3,3) #criando matriz
>
> numlinha<-3
> numcoluna<-3
> N<-3
>
> #funcao que realiza a multiplicação
> myf = function(N,mat1,mat2,num,x,y){
>    num + (mat1[x,N] * mat2[N,y])
> }
>
> #forma sequencial (já testada e que está correta)
> aux <-0
> for(i in 1:numlinha){
>   for(j in 1:numcoluna){
>     for(k in 1:N){
>        aux <-myf(k,m1,m2,aux,i,j)
>     }
>     m3[i,j] <- aux
>     aux <-0
>   }
> }
>
> ## resultado da execucao:
> ## matriz m1 multiplicada pela matriz m2 que gera a matriz m3
>> m1
>      [,1] [,2] [,3]
> [1,]    1    2    3
> [2,]    4    1    4
> [3,]    2    3    2
>
>> m2
>      [,1] [,2] [,3]
> [1,]    2    1    2
> [2,]    3    4    1
> [3,]    2    3    3
>
>> m3
>      [,1] [,2] [,3]
> [1,]   14   18   13
> [2,]   19   20   21
> [3,]   17   20   13
>
> Se eu fosse utilizar a função mclapply, ao invés das tres repetições (for),
> bastaria colocar:
>
> require(parallel)
> aux <- 0
> for(i in 1:numlinha){
>   mclapply(1:numcoluna,function(h){
>     for(k in 1:N){
>        aux <-myf(k,m1,m2,aux,i,h)
>     }
>     m3[i,h] <- aux
>     aux <-0
>   },mc.cores=2)
> }
>
> O problema é que não consigo armazenar os valores em cada posição da matriz
> (m3[i,h] <- aux), ou seja, ele não salva na matriz de destino m3, visto que
> isso ocorre dentro da chamado ao mclapply. Tentei utilizar o "unlist" mas
> não obtive sucesso.
>
> Alguem pode me auxiliar com isso?
>
> Att,
>
> Junior Beleti.
>
>
> _______________________________________________
> 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.


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