使用其他编程语言来加速R是一项重大创新,但似乎也很危险。任何统计函数都必须是稳定的,因为同一条目的结果相同,例如sum
,sd
,cor
...
我遇到的问题是使用大量数据(10 ^ 8样本)。我使用RCPP和RCPPPARALLEL版本的sum来演示大数据的错误。
#include <Rcpp.h>
using namespace Rcpp;
/********************************************************
* Rcpp inner function :sum
*******************************************************/
// [[Rcpp::export]]
double RCPPSUM(NumericVector x) {
return sum(x);
}
/*** R
library("Rcpp")
library("RcppParallel")
options(digits=22)# showing more details in number
sourceCpp(system.file("tests/cpp/sum.cpp", package = "RcppParallel"))
## Given two function parallelVectorSum (RcppParallel) and vectorSum (C++STL)
## We manipulated a very big vector
x<-rnorm(100000000)
(RSUM<-sum(x))
(RCPP<-RCPPSUM(x))
(RCPPPARALLEL<-parallelVectorSum(x))
(STD<-vectorSum(x))
identical(RSUM,RCPP)
identical(STD,RCPP)
identical(RSUM,RCPPPARALLEL)
identical(RCPP,RCPPPARALLEL)
## Simple checking of stability
v<-0
for(i in 1:100)v[i]<-sum(x)
(mean(v))
(sd(v))
####stable sd =0
for(i in 1:100)v[i]<-vectorSum(x)
(mean(v))
(sd(v))
###stable sd =0
for(i in 1:100)v[i]<-RCPPSUM(x)
(mean(v))
(sd(v))
###stable sd =0
for(i in 1:100)v[i]<-parallelVectorSum(x)
(mean(v))
(sd(v))
##instable sd!=0
*/
我们可以将并行版本限定为不稳定版本,因此将其排除在外。 RCPP和RSUM之间的结果真的是真的吗?
答案 0 :(得分:3)
简言之:
Rcpp
和RcppParallel
。虽然我猜你只是引用标签所以它并不重要。options(digits=22)
很可爱但没用。双精度为您提供大约16位数字。只是希望更多不会给你更多。