我试图在C ++中分别用于向量,矩阵和数据框中的R中实现原生分割函数。例如,下面的函数用于分割向量。
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);
}
但即使这比原生分割功能慢。我认为push_back函数使上述版本变慢,因为它为每次回退重新分配向量。但我不确定。欢迎提出任何建议和解释。
接下来Matrix的分割功能如下
//[[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);
}
但是这个实现比矢量的实现要糟糕得多。有没有办法改善这种实施?或者我错过了一些基本的东西?
我通过在C ++中使用Function对象来解决这些问题。例如
//[[Rcpp::export]]
List splitR(NumericMatrix x,NumericVector y){
Function sp("split");
return sp(x,y);
}
即使这个函数与原生分割有轻微的性能差异。请解释本机函数和函数对象之间的性能差异?