Ускорить матричные операции - PullRequest
0 голосов
/ 17 октября 2018

У меня есть две матрицы одинаковых размеров (которые в действительности имеют размер 2500 x 15 000):

set.seed(1)
a.mat <- matrix(rnorm(25*150),nrow=25,ncol=150,dimnames=list(paste0("p",1:25),paste0("c",1:150)))
b.mat <- matrix(rnorm(25*150),nrow=25,ncol=150,dimnames=list(paste0("p",1:25),paste0("c",1:150)))

И я вычисляю это с ними:

res.mat <- do.call(cbind,lapply(1:ncol(a.mat),function(i){
  t.mat <- a.mat-a.mat[,i]
  t.mat <- log10(abs(t.mat)+1) * sign(t.mat)
  return(suppressWarnings(cor(t.mat,b.mat[,i])))
}))

ЛюбойИдея, если и как это может быть сделано быстрее, чем в настоящее время я делаю это?Возможно, запустив его параллельно с multidplyr?

Per `multidplyr, вот что я пытаюсь:

library(dplyr)

df <- do.call(rbind,lapply(1:ncol(a.mat),function(i){
    cbind(reshape2::melt(a.mat) %>% dplyr::rename(id=Var1,cell=Var2,a.value=value),
          do.call("rbind",replicate(ncol(a.mat),data.frame(cell.i=colnames(a.mat)[i],a.value.i=a.mat[,i]),simplify=F)),
          do.call("rbind",replicate(ncol(a.mat),data.frame(b.value.i=b.mat[,i]),simplify=F)))
  })) %>% dplyr::mutate(t.value=a.value-a.value.i) %>% dplyr::mutate(t.value=log10(abs(t.value)+1)*sign(t.value)) %>% dplyr::group_by(cell.i)

А затем:

group.size <- 3
n.groups <- ceiling(ncol(a.mat)/group.size)

for(i in 1:n.groups){
  start.idx <- (i-1)*group.size+1
  end.idx <- min(i*group.size,ncol(a.mat))
  current.df <- df %>% dplyr::filter(cell.i %in% colnames(a.mat)[start.idx:end.idx])
  current.df <- current.df %>% multidplyr::partition(cell.i) %>% multidplyr::cluster_library("tidyverse") %>% multidplyr::cluster_library("MASS") %>%
    multidplyr::cluster_assign_value("myFunction", myFunction) %>%
    do(results = myFunction(.)) %>% dplyr::collect() %>% .$results %>% dplyr::bind_rows()
}

Где:

myFunction <- function(df)
{
  return(df %>% dplyr::group_by(e.cell) %>% dplyr::mutate(cor=cor(t.value,b.value.i)))
}

Однако, появляется это сообщение об ошибке:

Error in checkForRemoteErrors(lapply(cl, recvResult)) :
  3 nodes produced errors; first error: Can't convert an environment to function
Call `rlang::last_error()` to see a backtrace
In addition: Warning message:
group_indices_.grouped_df ignores extra arguments

Итак, использование multidplyr таким образом даже стоит?и если да, то есть идеи, что я здесь делаю не так?

...