减少 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))
我想计算两个非常大的向量(超过 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))