减少 R 中大向量的双变量 ecdf 的计算时间

1 for-loop r rcpp

我想计算两个非常大的向量(超过 2.5 亿个元素)的双变量经验累积密度函数,以使用 for 循环计算每对值 i:n 的百分比并将其存储在结果向量中。由于两个向量的长度很明显,计算时间会非常长,所以我想把我的for循环翻译成rcpp。

# minimal working example

vec_a <- runif(1e+4)
vec_b <- rnorm(1e+4)
total <- length(vec_b)
store <- vector()

for(i in 1:total){store[i] <- sum(vec_a <= vec_a[i] & vec_b <= vec_b[i])/total}
Run Code Online (Sandbox Code Playgroud)

我试图翻译我的循环,但由于我刚刚开始使用 rcpp,有些事情我不太清楚。如果有人能给我一个答案 a.) 为什么结果不相同 b.) 如果可以加速 rcpp 代码,我会很高兴。

# Rcpp protoype
library(Rcpp)
cppFunction(
  "NumericVector FasterLoop(NumericVector x, NumericVector y) {
  const int n = x.length();
  NumericVector z(n);
  for (int i=0; i < n; ++i) {
   z[i] = sum(x <= x[i] & y <= y[i])/n;
  }
  return z;
}")

proto <- FasterLoop(vec_a, vec_b)
Run Code Online (Sandbox Code Playgroud)

Sté*_*ent 5

问题是sum(x <= x[i] & y <= y[i])返回一个整数,然后sum(x <= x[i] & y <= y[i])/n执行整数除法。您必须强制sum(x <= x[i] & y <= y[i])转换为double. 这是通过执行z[i] = sum(x <= x[i] & y <= y[i])然后除以自动完成z[i]n

library(Rcpp)
cppFunction(
  "NumericVector FasterLoop(NumericVector x, NumericVector y) {
  const int n = x.length();
  NumericVector z(n);
  for (int i=0; i < n; ++i) {
   z[i] = sum(x <= x[i] & y <= y[i]);
  }
  return z/n;
}")

FasterLoop(c(1,2,3), c(1,2,3))
Run Code Online (Sandbox Code Playgroud)