相关疑难解决方法(0)

在Rcpp中排序排列,即base :: order()

我有很多代码使用base :: order()命令,我真的懒得在rcpp中编写代码.由于Rcpp只支持排序,但不支持订单,我花了2分钟创建这个功能:

// [[Rcpp::export]]
Rcpp::NumericVector order_cpp(Rcpp::NumericVector invec){
  int leng = invec.size();
  NumericVector y = clone(invec);
  for(int i=0; i<leng; ++i){
    y[sum(invec<invec[i])] = i+1;
  }
  return(y);
}
Run Code Online (Sandbox Code Playgroud)

它有点工作.如果向量包含唯一数字,我得到与order()相同的结果.如果它们不是唯一的,结果是不同的,但没有错(实际上没有唯一的解决方案).

使用它:

c=sample(1:1000,500)
all.equal(order(c),order_cpp(c))
microbenchmark(order(c),order_cpp(c))

Unit: microseconds
         expr      min       lq   median       uq      max neval
     order(c)   33.507   36.223   38.035   41.356   78.785   100
 order_cpp(c) 2372.889 2427.071 2466.312 2501.932 2746.586   100
Run Code Online (Sandbox Code Playgroud)

哎哟! 我需要一个有效的算法.好的,所以我挖出了一个bubbleort实现并对其进行了调整:

 // [[Rcpp::export]]
Rcpp::NumericVector bubble_order_cpp2(Rcpp::NumericVector vec){                                  
       double tmp = 0;
       int n = vec.size();
              Rcpp::NumericVector outvec = clone(vec);
       for (int i …
Run Code Online (Sandbox Code Playgroud)

r rcpp

7
推荐指数
2
解决办法
2380
查看次数

标签 统计

r ×1

rcpp ×1