Как ускорить двойной Rcpp для цикла - PullRequest
0 голосов
/ 23 мая 2019

Поскольку я не являюсь экспертом в C ++ (или Rcpp), мне было интересно, есть ли другие / лучшие способы написать эту маленькую функцию ниже, которая использует 2 для циклов, чтобы заполнить матрицу на основе значений 2 других матриц .

Вот некоторые примеры данных:

  library(Rcpp)

  sizem <- 50000
  n <- 500
  k <- 5
  d <- matrix(nrow = n, ncol = k, 0)
  x <- matrix(nrow = n, ncol = sizem, runif(sizem*n, 0, 500))
  rownames(x) <- paste0("p-",1:n)
  v <- matrix(nrow = k, ncol = sizem, sample(0:300, size = sizem*k, T))

и функция в настоящее время выглядит следующим образом:

  cppFunction("
  NumericMatrix compdistc(NumericMatrix d, NumericMatrix x, NumericMatrix v, int k, int n) {
    NumericMatrix out = clone(d);
    int i,j;
    for (j=0; j < k; ++j) {
      for (i=0; i < n; ++i) {
        out(i,j) = sum(pow((x(i,_) - v(j,_)), 2));
      }
    }
    return(out);
  }
  ")

  out <- compdistc(d, x, v, k, n)

и это мой текущий тест:

  mc <- microbenchmark(times = 10,
    out = compdistc(d, x, v, k, n)
  ); mc
Unit: seconds
 expr      min       lq     mean   median       uq      max neval
  out 2.123477 2.135013 2.174556 2.148467 2.204108 2.354089    10
...