R 与 Rcpp 中的递归均值
Recursive Mean in R vs. Rcpp
我正在尝试使用简单的递归实现来计算变量的平均值:
m <- 0 # initialize mean
for(irep in 0:999){
# new data point
new_data <- rnorm(1,2,1)
# recursive formula for sample mean
m = (irep/(irep+1)) * m + (1/(irep+1)) * new_data
}
这里,m
将很快收敛到 2,这对应于我们从中生成新数据点的正态分布的均值。在 Rcpp 中实现类似的东西:
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
// [[Rcpp::export]]
double rec_mean(int sample_size){
double m = 0; //initialize mean
for(int irep = 0; irep < sample_size; irep++){
// new data
double new_data = R::rnorm(2,1);
// mean recursive update
m = ((irep)/(irep+1)) * m + (1/(irep+1)) * new_data;
}
return m;
}
此代码未显示预期行为。相反,它 returns 初始值。有人能告诉我我从 R 到 Rcpp 的翻译错误在哪里吗?
这一行:
m = ((irep)/(irep+1)) * m + (1/(irep+1)) * new_data;
您将 int
除以另一个 int
两次。在 C++ 中,整数除法 returns 另一个整数,舍弃余数。
为了得到你想要的结果,强制以浮点数进行除法:
m = ((irep)/(irep+1.0)) * m + (1.0/(irep+1.0)) * new_data;
我正在尝试使用简单的递归实现来计算变量的平均值:
m <- 0 # initialize mean
for(irep in 0:999){
# new data point
new_data <- rnorm(1,2,1)
# recursive formula for sample mean
m = (irep/(irep+1)) * m + (1/(irep+1)) * new_data
}
这里,m
将很快收敛到 2,这对应于我们从中生成新数据点的正态分布的均值。在 Rcpp 中实现类似的东西:
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
// [[Rcpp::export]]
double rec_mean(int sample_size){
double m = 0; //initialize mean
for(int irep = 0; irep < sample_size; irep++){
// new data
double new_data = R::rnorm(2,1);
// mean recursive update
m = ((irep)/(irep+1)) * m + (1/(irep+1)) * new_data;
}
return m;
}
此代码未显示预期行为。相反,它 returns 初始值。有人能告诉我我从 R 到 Rcpp 的翻译错误在哪里吗?
这一行:
m = ((irep)/(irep+1)) * m + (1/(irep+1)) * new_data;
您将 int
除以另一个 int
两次。在 C++ 中,整数除法 returns 另一个整数,舍弃余数。
为了得到你想要的结果,强制以浮点数进行除法:
m = ((irep)/(irep+1.0)) * m + (1.0/(irep+1.0)) * new_data;