C++ Rcpp中apply函数的实现
到目前为止,我一直在尝试在Rcpp中实现apply函数,代码如下所示C++ Rcpp中apply函数的实现,c++,rcpp,syntactic-sugar,C++,Rcpp,Syntactic Sugar,到目前为止,我一直在尝试在Rcpp中实现apply函数,代码如下所示 //[[Rcpp::export]] NumericVector apply(NumericMatrix x,int dim,Function f){ NumericVector output; if(dim==1){ for(int i=0;i<x.nrow();i++){ output[i]=f(x(i,_)); } } else if(dim==2){ for(i
//[[Rcpp::export]]
NumericVector apply(NumericMatrix x,int dim,Function f){
NumericVector output;
if(dim==1){
for(int i=0;i<x.nrow();i++){
output[i]=f(x(i,_));
}
}
else if(dim==2){
for(int i=0;i<x.ncol();i++){
output[i]=f(x(_,i));
}
}
return(output);
}
/[[Rcpp::export]]
数值向量应用(数值矩阵x、整数尺寸、函数f){
数字矢量输出;
如果(dim==1){
对于(int i=0;i而言,答案依次为“是”和“是”,您可能需要阅读“Rcpp简介”,其中包含以下lappy()
示例:
R> src <- '
+ Rcpp::List input(data);
+ Rcpp::Function f(fun);
+ Rcpp::List output(input.size());
+ std::transform(input.begin(), input.end(), output.begin(), f);
+ output.names() = input.names();
+ return output;
+ '
R> cpp_lapply <- cxxfunction(signature(data = "list", fun = "function"),
+ src, plugin = "Rcpp")
R>src cpp\u lappy对于apply
没有糖函数。最简单的方法是将称为,即:
output[i]=as<double>(f(x(i,_)));
这样你就可以:
// [[Rcpp::export]]
NumericVector apply_cpp(NumericMatrix x,int dim,F<double> f){
if(dim==1){
NumericVector output(x.nrow());
for(int i=0;i<x.nrow();i++){
output[i]=f(x(i,_));
}
return output ;
}
else {
NumericVector output(x.ncol());
for(int i=0;i<x.ncol();i++){
output[i]=f(x(_,i));
}
return output ;
}
}
然后签名将变成:
// [[Rcpp::export]]
NumericVector apply_cpp(NumericMatrix x,int dim,F<double,NumericVector> f){
/[[Rcpp::export]]
数值向量应用(数值矩阵x,整数维,F){
我还尝试将返回值显式转换为double,但这似乎不如显式转换为double
那样有效。代码的另一个问题是输出的大小不正确。因此,即使在这两个位置添加as
,也不会得到正确的结果你想要什么,作为奖励,当你指定越界,并且Rcpp不进行边界检查时,你会得到未定义的行为。@RomainFrancois感谢你指出这一点。:)谢谢你的回答:),函数的参数是一个数字向量,它返回一个双值。谢谢@Romain Francois,这是一个更广义的解决方案:)好吧,这实际上是在回答问题,而不是抛出模糊相关的东西。我也不清楚函数对象。它类似于函数点吗你能给我一些指针来学习RCPP中的函数对象吗?<代码>函数< /> >是一个RCPP API类,它封装了一个R函数对象,并允许你用C++ <代码>操作器()/<代码>调用函数。
template <typename T, typename... Args>
class F {
public:
F( SEXP f_) : f(f_){}
inline T operator()(Args... args){
return as<T>(f(args...)) ;
}
private:
Function f ;
} ;
// [[Rcpp::export]]
NumericVector apply_cpp(NumericMatrix x,int dim,F<double,NumericVector> f){