用Rcpp计算频率的快速方法

时间:2018-02-16 21:02:17

标签: r rcpp

对C ++没有太多经验的常见警告适用。我需要在Rcpp中计算hist(x, breaks=breaks, plot=FALSE)$counts的等价物。

我已经编写了以下Rcpp函数来计算频率:

#include <Rcpp.h>
using namespace Rcpp;


// [[Rcpp::export]]
NumericVector get_freq(NumericVector x, NumericVector breaks) {
  int nbreaks = breaks.size();
  NumericVector out(nbreaks-1);
  for (int i=0; i<nbreaks-1; i++) {
    LogicalVector temp = (x>breaks(i)) & (x<=breaks(i+1));
    out[i] = sum(temp);
  }

  return(out);
}

该函数由另一个Rcpp函数多次调用。

问题是运行时间随着x

的长度线性增加
breaks <- seq(from=0, to=max(x)+1, length.out=101) 

library(microbenchmark)
microbenchmark(get_freq(runif(100, 1, 100), breaks),
               get_freq(runif(1000, 1, 100), breaks),
               get_freq(runif(3000, 1, 100), breaks))

Unit: microseconds
                                  expr      min       lq      mean   median       uq      max neval cld
 get_freq(runif(100, 1, 100), breaks)  176.420  184.611  190.1675  188.415  191.633  313.927   100 a  
 get_freq(runif(1000, 1, 100), breaks) 1700.119 1714.309 1807.4252 1732.302 1809.687 5564.958   100  b 
 get_freq(runif(3000, 1, 100), breaks) 5134.003 5157.701 5342.2800 5177.157 5434.180 9242.844   100   c

get_freq被多次调用,x通常长度为3000+,并且导致Rcpp代码中的瓶颈,否则比R等价物快得多。

有关提高get_freq速度的方法的建议吗?

更新

在发布这个问题后,我意识到我应该在搜索C ++直方图&#39;而不是&#39; C ++频率&#39;。我找到了this回答,我认为这样做了。不幸的是,它没有。

我需要频率函数来返回固定长度的矢量(即nbreaks),如上所述。链接的答案不会这样做 - 它只返回观察值的计数

0 个答案:

没有答案