对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),如上所述。链接的答案不会这样做 - 它只返回观察值的计数