gpt4 book ai didi

r - 避免 R 中的两个 for 循环

转载 作者:行者123 更新时间:2023-12-02 05:00:13 28 4
gpt4 key购买 nike

我有一个 R 代码,可以对两个函数进行卷积...

convolveSlow <- function(x, y) {  
nx <- length(x); ny <- length(y)
xy <- numeric(nx + ny - 1)
for(i in seq(length = nx)) {
xi <- x[[i]]
for(j in seq(length = ny)) {
ij <- i+j-1
xy[[ij]] <- xy[[ij]] + xi * y[[j]]
}
}
xy
}

有没有办法去掉两个for循环,让代码运行得更快?

谢谢桑

最佳答案

由于 R 在计算向量运算方面速度非常快,因此在进行性能编程时要记住的最重要的事情是对尽可能多的运算进行向量化。

这意味着要认真考虑用向量运算替换循环。这是我的快速卷积解决方案(每个长度为 1000 的输入向量快 50 倍):

convolveFast <- function(x, y) {
nx <- length(x)
ny <- length(y)
xy <- nx + ny - 1
xy <- rep(0, xy)
for(i in (1:nx)){
j <- 1:ny
ij <- i + j - 1
xy[i+(1:ny)-1] <- xy[ij] + x[i] * y
}
xy
}

您会注意到内部循环(for j in ...)已经消失。相反,我用向量运算替换了它。 j 现在定义为向量 (j <- 1:ny)。另请注意,我指的是整个向量 y,而不是对其进行子集化(即 y 而不是 y[j])。

j <- 1:ny
ij <- i + j - 1
xy[i+(1:ny)-1] <- xy[ij] + x[i] * y

我编写了一个小函数来衡量性能:

measure.time <- function(fun1, fun2, ...){
ptm <- proc.time()
x1 <- fun1(...)
time1 <- proc.time() - ptm

ptm <- proc.time()
x2 <- fun2(...)
time2 <- proc.time() - ptm

ident <- all(x1==x2)

cat("Function 1\n")
cat(time1)
cat("\n\nFunction 2\n")
cat(time2)
if(ident) cat("\n\nFunctions return identical results")

}

对于两个长度各为 1000 的向量,我获得了 98% 的性能提升:

x <- runif(1000)
y <- runif(1000)
measure.time(convolveSlow, convolveFast, x, y)

Function 1
7.07 0 7.59 NA NA

Function 2
0.14 0 0.16 NA NA

Functions return identical results

关于r - 避免 R 中的两个 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4894506/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com