я получаю немного более высокую производительность, запустив outer
функцию отдельно и подмножества нулевой < 0
статей, как это ...
res1 <- t(outer(r , s , "-"))
res1[ res1 < 0 ] <- 0
Но если вы хотите еще больше скорости, то попробуйте использовать Rcpp
. Это достаточно легко, просто запустите следующий фрагмент кода ....
if(! require(Rcpp)) install.packages("Rcpp")
Rcpp::cppFunction('
NumericMatrix gtzero(NumericVector r , NumericVector s){
int cols = r.size();
int rows = s.size();
NumericMatrix out(rows, cols);
for(int i = 0; i < cols; i++){
NumericMatrix::Column ncol = out(_, i);
ncol = ifelse(r[i] - s > 0 , r[i] - s , 0);
}
return out;
}
')
Затем используйте функцию следующим образом:
gtzero(r , s)
Это оказывается примерно в 6 раз быстрее, чем при использовании outer
и pmax
и в 3 раза быстрее, чем outer
затем [
Подменю:
require(microbenchmark)
bm <- microbenchmark(eval(rose.baseR) , eval(simon.baseR) , eval(simon.Rcpp))
print(bm , "relative" , order = "median" , digits = 2)
#Unit: relative
# expr min lq median uq max neval
# eval(simon.Rcpp) 1 1.0 1.0 1.0 1.0 100
# eval(simon.baseR) 3 3.1 3.2 3.2 1.5 100
# eval(rose.baseR) 3 3.4 6.0 5.9 1.8 100
и дает тот же результат:
identical(res0 , res2)
#[1] TRUE
Следующие выражения были оценены:
set.seed(123)
r = rnorm(100000)
s = c(0.02, 0.04, 0.3, 0.43, 0.5, 0.7, 0.8, 0.9)
rose.baseR <- quote({
res0 <- t(pmax(outer(r, s, "-"), 0))
})
simon.baseR <- quote({
res1 <- outer(r , s , "-")
res1[ res1 < 0 ] <- 0
})
simon.Rcpp <- quote({
res2 <- gtzero(r,s)
})
Может быть, вы могли бы описать то, что вы пытаетесь сделать в словах – Dason
Вы могли бы выкопать вокруг во внутренности «внешнего» и просто вытаскивать биты, которые фактически выполняют вычисления без проверки. Не уверен, действительно ли это будет стоить секунд секунд, которые вы бы сэкономили. – thelatemail