【问题标题】:Rcpp Function Compilation ErrorRcpp函数编译错误
【发布时间】:2015-08-24 20:42:47
【问题描述】:

原R函数:

psiBiSquare<-function(r,c){
true<-abs(r)<=c
false<-abs(r)>c
psi<-true*(r*(1-(r/c)^2)^2)+false*0
return(psi)
}

我将在下面用更快的 Rcpp 实现替换它:

 #include <Rcpp.h>
#include <math.h>
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector psiBS_rcpp(NumericVector r, double c) {
int n =r.size();
NumericVector y = clone(r);

for(int i=0;i<n;i++){
 if(abs(r[i])<=c){
  y[i]=(r*pow(1-pow(r/c,2),2));
 }
 else{
  y[i]=0;
 }
}
 return y;
}

错误信息是“cannot convert rcpp::sugar::”我做错了什么?

【问题讨论】:

    标签: r rcpp


    【解决方案1】:

    几件事:

    1. 您的代码格式真的很差。空间不收取额外费用。使用它们。

    2. 您对r 犹豫不决,同时将其用作向量,并将其元素用作标量。您的右侧表达式已矢量化,但您尝试分配给标量 y[i]

    改进/更正的源文件:

    #include <Rcpp.h>
    #include <math.h>
    using namespace Rcpp;
    
    // [[Rcpp::export]]    
    NumericVector psiBS_rcpp(NumericVector r, double c) {
      int n = r.size();
      NumericVector y = clone(r);
    
      for (int i=0; i<n; i++) {
        if (abs(r[i]) <=c ) {
          y[i] = (r[i]*pow(1-pow(r[i]/c,2),2));
        }
        else{
          y[i]=0;
        }
      }
      return y;
    }
    
    /*** R
    psiBiSquare <- function(r,c) {
      true <- abs(r) <= c
      false <- abs(r) > c 
      psi <- true * (r*(1-(r/c)^2)^2) + false*0
      return(psi)
    }
    
    r <- seq(-3,3)
    c <- 1.5
    psiBiSquare(r, c) 
    psiBS_rcpp(r, c)
    */
    

    运行它:

    R> sourceCpp("/tmp/ij.cpp")
    
    R> psiBiSquare <- function(r,c) {
    +   true <- abs(r) <= c
    +   false <- abs(r) > c
    +   psi <- true * (r*(1-(r/c)^2)^2) + false*0
    +   return(psi)
    + }
    
    R> r <- seq(-3,3)
    
    R> c <- 1.5
    
    R> psiBiSquare(r, c)
    [1]  0.000000  0.000000 -0.308642  0.000000  0.308642  0.000000  0.000000
    
    R> psiBS_rcpp(r, c)
    [1]  0.000000  0.000000 -0.308642  0.000000  0.308642  0.000000  0.000000
    R> 
    

    【讨论】:

    • 谢谢德克。一如既往的好建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 2014-05-09
    • 2015-05-05
    • 1970-01-01
    相关资源
    最近更新 更多