関数を個別に実行し、このようにゼロエントリを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 )
outer
これは、andを使用するよりも約 6 倍高速であり、サブセット化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)
})