<div>Bom dia a todos.</div><div><br></div><div>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.</div>
<div><br></div><div>Sei que existe o operador %*% que já realiza a multiplicação matricial, porém, como já disse antes, estou apenas realizando experimentos.</div><div><br></div><div>Segue código:</div><div><br></div><div>
m1 <- matrix(0,3,3) #criando matriz</div><div>m1[1,1]<-1</div><div>m1[1,2]<-2</div><div>m1[1,3]<-3</div><div>m1[2,1]<-4</div><div>m1[2,2]<-1</div><div>m1[2,3]<-4</div><div>m1[3,1]<-2</div><div>m1[3,2]<-3</div>
<div>m1[3,3]<-2</div><div>m2 <- matrix(0,3,3) #criando matriz</div><div>m2[1,1]<-2</div><div>m2[1,2]<-1</div><div>m2[1,3]<-2</div><div>m2[2,1]<-3</div><div>m2[2,2]<-4</div><div>m2[2,3]<-1</div><div>
m2[3,1]<-2</div><div>m2[3,2]<-3</div><div>m2[3,3]<-3</div><div>m3 <- matrix(0,3,3) #criando matriz</div><div><br></div><div>numlinha<-3</div><div>numcoluna<-3</div><div>N<-3</div><div><br></div><div>#funcao que realiza a multiplicação</div>
<div>myf = function(N,mat1,mat2,num,x,y){</div><div>   num + (mat1[x,N] * mat2[N,y])</div><div>}   </div><div><br></div><div>#forma sequencial (já testada e que está correta)</div><div>aux <-0</div><div>for(i in 1:numlinha){</div>
<div>  for(j in 1:numcoluna){</div><div>    for(k in 1:N){</div><div>       aux <-myf(k,m1,m2,aux,i,j)</div><div>    }  </div><div>    m3[i,j] <- aux</div><div>    aux <-0</div><div>  }</div><div>}</div><div><br>
</div><div>## resultado da execucao:</div><div>## matriz m1 multiplicada pela matriz m2 que gera a matriz m3</div><div>> m1</div><div>     [,1] [,2] [,3]</div><div>[1,]    1    2    3</div><div>[2,]    4    1    4</div>
<div>[3,]    2    3    2</div><div><br></div><div>> m2</div><div>     [,1] [,2] [,3]</div><div>[1,]    2    1    2</div><div>[2,]    3    4    1</div><div>[3,]    2    3    3</div><div><br></div><div>> m3</div><div>
     [,1] [,2] [,3]</div><div>[1,]   14   18   13</div><div>[2,]   19   20   21</div><div>[3,]   17   20   13</div><div><br></div><div>Se eu fosse utilizar a função mclapply, ao invés das tres repetições (for), bastaria colocar:</div>
<div><br></div><div>require(parallel)</div><div>aux <- 0</div><div>for(i in 1:numlinha){</div><div>  mclapply(1:numcoluna,function(h){</div><div>    for(k in 1:N){</div><div>       aux <-myf(k,m1,m2,aux,i,h)</div><div>
    }  </div><div>    m3[i,h] <- aux</div><div>    aux <-0</div><div>  },mc.cores=2)<span class="Apple-tab-span" style="white-space:pre">   </span></div><div>}</div><div><br></div><div>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.</div>
<div><br></div><div>Alguem pode me auxiliar com isso?</div><div><br></div><div>Att,</div><div><br></div><div>Junior Beleti.</div><div><br></div>