r - 在 R 中创建此矩阵的最快方法

标签 r

我有两个向量 rs。我想找到这两个数组的外部差异,而不是像下面这样的负数

r = rnorm(100000)
s = c(0.02, 0.04, 0.3, 0.43, 0.5, 0.7, 0.8, 0.9)
res = t(pmax(outer(r, s, "-"), 0))
system.time({
res = t(pmax(outer(r, s, "-"), 0))
})
## system elapsed 
## 0.05    0.00    0.05 

system.time({
    x = pmax(r - rep(s, each = length(r)), 0)
    res = matrix(x, nrow = length(s), byrow = TRUE)
})

## system elapsed 
## 0.05    0.00    0.05 

如何在 R 中更快地得到结果 x?

最佳答案

我通过运行 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 快 6 倍左右和 pmaxouter 快 3 倍然后 [子集:

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)
})

关于r - 在 R 中创建此矩阵的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18478646/

相关文章:

r - 在 ggplot 2 2.0 中向 facet labeller 添加表达式

r - 将数字格式设置为固定宽度,并带有前导零

r - 并行读/写文件是个好主意吗?

r - 如何为每一行创建折线?

r - 在 R 中,如何创建一个函数,其中向量中的所有数字都被重新缩放,Inf 变为 1,而 -Inf 变为 0?

r - 如何在R中获取货币汇率

r - 如何将 p 值添加到 R 中的一致性索引图中?

r - 如何返回满足特定条件的向量中的最后一个值

r - 如何像箱线图一样在 R 中创建分类散点图?

r - 分解并替换省略号以获取参数名称