使用Rcpp进行引导

时间:2018-03-22 12:47:16

标签: rcpp armadillo

我正在使用Rcpp实现一个引导程序,似乎遇到了性能瓶颈(?)。基本上,我使用RcppArmadillo创建启动矩阵,从fit_power_law调用igraph函数并估计幂律系数。代码如下:

#include <RcppArmadillo.h>
#include <RcppArmadilloExtensions/sample.h>

using namespace Rcpp;

// [[Rcpp::depends(RcppArmadillo)]] 

double alphaPLFit(const arma::vec& x) {

  Environment igraph("package:igraph");
  Function fit_power_law = igraph["fit_power_law"];

  List p = fit_power_law(Named("x", x));

  return p["alpha"];
}

arma::mat bootstraps(const arma::vec& x, int times) {
  arma::mat bootMatrix;

  for (int t = 0; t < times; ++t) {
    arma::vec resample = RcppArmadillo::sample(x, x.n_elem, true);
    bootMatrix.insert_cols(t, resample);
  }

  return bootMatrix;
}

// [[Rcpp::export]]
arma::vec bootAlphaPLFit(const arma::vec& x, int times) {
  arma::mat bootMatrix = bootstraps(x, times);
  arma::vec alphas(times);

  for (int i = 0; i < times; ++i) {
    double alpha = alphaPLFit(bootMatrix.col(i));
    alphas[i] = alpha;
  }

  return alphas;
}

/***R
library(igraph)
sampleData <- degree(sample_pa(n = 1e5, m = 3, directed = FALSE))
system.time(bootAlphaPLFit(sampleData, 500))

*/

这需要大约一分钟才能在我的电脑上运行。作为比较,boot包中的boot函数大约需要30秒,并使用自定义统计信息调用igraph::fit_power_law并提取alpha。

有什么方法可以加快速度吗?

0 个答案:

没有答案