Junção de dados no mclapply

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.

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@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@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.
participantes (2)
-
Benilton Carvalho
-
Junior Beleti