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::"我做错了什么?
两件事:
你的代码格式真的很差。空间不收取额外费用。使用它们。
您对 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>
原始 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
犹豫不决,同时将其用作向量,将其元素用作标量。您的右侧表达式是矢量化的,但您尝试分配给标量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>