Поскольку я не являюсь экспертом в 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