Rcpp rowMaxs 与 matrixStats rowMaxs

Mr.*_*Zen 5 r rcpp

我正在尝试在 Rcpp 中有效地计算 rowMaxs。一个非常简单的实现是

arma::mat RcppRowmaxs(arma::mat x){  

  int N = x.n_rows;
  arma::mat rm(N,1);

  for(int nn = 0; nn < N; nn++){
      rm(nn) = max(x.row(nn));
  }

  return(rm);
}
Run Code Online (Sandbox Code Playgroud)

这工作得很好。但是,将此功能与其他包进行比较,结果证明其他实现要高效得多。具体来说,Rfast::rowMaxs比简单的 Rcpp 实现快 6 倍以上!

自然地,我试图模仿Rfast. 但是,作为 Rcpp 的初学者,我只尝试Rfast::rowMaxs直接在 Rcpp 中加载,例如此处所述。不幸的是,根据我的基准测试,使用 Rcpp 脚本加载再次调用 Rcpp 脚本的 R 函数似乎很慢(请参阅“RfastinRcpp”行):

m = matrix(rnorm(1000*1000),1000,1000)

microbenchmark::microbenchmark(

  matrixStats    = matrixStats::rowMaxs(m),
  Rfast          = Rfast::rowMaxs(m,value=T),
  Rcpp           = RcppRowmaxs(m),
  RfastinRcpp    = RfastRcpp(m),
  apply          = apply(m,1,max)

)

Unit: microseconds
        expr       min         lq       mean     median        uq        max neval cld
 matrixStats  1929.570  2042.8975  2232.1980  2086.5180  2175.470   4025.923   100 a  
       Rfast   666.711   727.2245   842.5578   795.2215   891.443   1477.969   100 a  
        Rcpp  5552.216  5825.4855  6186.9850  5997.8295  6373.737   8568.878   100  b 
 RfastinRcpp  7495.042  7931.2480  9471.8453  8382.6350 10659.672  19968.817   100  b 
       apply 12281.758 15145.7495 22015.2798 17202.9730 20310.939 136844.591   100   c
Run Code Online (Sandbox Code Playgroud)

关于如何提高我上面提供的功能的性能的任何提示?我查看了源代码Rfast并相信是正确的文件。但是,到目前为止,我还没有找到代码的重要部分。

编辑:Rfast根据 Michail 的回答,将帖子更改为现在关注。

小智 2

我刚刚在我的笔记本电脑上做了一些实验。我有一台使用了 5 年的 HP,配备 2 个英特尔 i5 内核,主频为 2.3 GHz。附上一张带有我的结果的图片。Rfast 的实现总是比 MatrixStats 的实现快得多,并且随着矩阵变大,时间差也会增加。

在此输入图像描述

  • @ManosPapadakis,我明白。但如果我想确认结果,就很难重现。我必须手动输入图片中的所有内容,而不是简单地复制和粘贴代码片段。请查看此处的 **完整** 部分:https://stackoverflow.com/help/minimal-reproducible-example。它指出:**“不要使用代码图像。从代码编辑器复制实际文本,将其粘贴到问题中,然后将其格式化为代码。这可以帮助其他人更轻松地阅读和测试您的代码。”** (2认同)
  • 现在更改了帖子以重点关注 Rfast 实现,它在速度方面更令人印象深刻! (2认同)