Rcpp 函数编译错误

Rcpp Function Compilation Error

原始 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::"我做错了什么?

两件事:

  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>