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

Reduce computation time of bivariate ecdf with large vectors in R

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

我尝试翻译我的循环,但由于我刚开始使用 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)

问题是sum(x <= x[i] & y <= y[i])returns一个整数,然后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))