Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Rcpp中实现split()函数 我尝试在C++中实现向量、矩阵和数据帧的R中的本机分割函数。例如,下面的函数起分裂向量的作用。_C++_Performance_Algorithm_Rcpp - Fatal编程技术网

在Rcpp中实现split()函数 我尝试在C++中实现向量、矩阵和数据帧的R中的本机分割函数。例如,下面的函数起分裂向量的作用。

在Rcpp中实现split()函数 我尝试在C++中实现向量、矩阵和数据帧的R中的本机分割函数。例如,下面的函数起分裂向量的作用。,c++,performance,algorithm,rcpp,C++,Performance,Algorithm,Rcpp,using namespace Rcpp; using namespace std; //[[Rcpp::export]] List splitVecCpp(NumericVector x, NumericVector y) { std::map<double,NumericVector> output; for (int i=0;i<x.size();i++) { output[ y[i] ].push_back(x[i]); }

using namespace Rcpp;
using namespace std;
//[[Rcpp::export]]
List splitVecCpp(NumericVector x, NumericVector y) {
std::map<double,NumericVector> output;
 for (int i=0;i<x.size();i++) {
        output[ y[i] ].push_back(x[i]);
      }
           return wrap(output);
}

即使这个函数与本机剥离也有轻微的性能差异。请解释本机函数和函数对象之间的性能差异?

是否有改进此实现的方法?当然有,编程可能很难,也很有挑战性。您可能制作了太多的临时副本,但不幸的是,我的空闲时间太短,无法为您调试。也许可以看看它的来源以及它的设计(和相关的)任务。一般来说,在R和C++对象之间移动应该是你做的第一件也是最后一件事。如果您需要高效增长的东西,请使用
std::vector
——例如,填充
std::vector
,然后在完成后将其转换为
NumericVector
。@KevinUshey谢谢。我将尝试一下,然后将结果发布到这里。使用stl vector而不是NumericVector使SplitveCpp增加了25倍。是的,您不想在Rcpp对象上执行类似于
.push_back()
的操作。由于其
SEXP
性质和固定大小,每次都需要一份完整的副本。
//[[Rcpp::export]]
std::map<double,std::set<int> > uniqueCpp(NumericVector x){
std::map<double,std::set<int> > out; 
for(int i=0;i<x.length();i++){
  if(out.count(x[i])){
    std::set<int> temp_set=out.find(x[i])->second;
    temp_set.insert(i);
    out[x[i]]=temp_set;
  }else{
    std::set<int> temp_set;
    temp_set.insert(i);
    out[x[i]]=temp_set;
  }
}
return out;
}

//[[Rcpp::export]]
List splitMatCpp(NumericMatrix splited,NumericVector spliter){
std::map<double,std::set<int> > uniqueSpliter=uniqueCpp(spliter); 
std::map<double,NumericMatrix> output;

for(std::map<double , std::set<int> >::iterator it=uniqueSpliter.begin();it!=uniqueSpliter.end();++it){
  std::set<int> indices=it->second;
  NumericMatrix temp_mat(indices.size(),splited.ncol());
  int j=0;
  for(std::set<int>::iterator index_it=indices.begin();index_it!=indices.end();++index_it){
    temp_mat(j,_)=splited(*index_it,_);
    j++;
  }
  output[it->first]=temp_mat;
 }
 return wrap(output);
}
//[[Rcpp::export]]
List splitR(NumericMatrix x,NumericVector y){
 Function sp("split");
 return sp(x,y);

}