我有一个简单的功能,称为数百次。有什么方法可以提高其计算速度?
# the input variable (y) is a scalar
my_function <- function(y){
ret_value <- 0.5*((max(0,y)**2)-(3*max(0,y-1)**2)+(3*max(0,y-2)**2)-(max(0,y-3)**2))
return(ret_value)
}
我已经尝试了if
&amp;else if
语句,导致计算时间稍长。
我也阅读了很多有关rcpp
软件包的信息,但是我理解的是,C 实现主要有助于更复杂的结构,例如递归和多个循环。不确定像我这样的简单功能是否会有任何改进。
编辑:父函数如下,因此,矢量化可能是最好的主意。最好/最快的方法是什么?
val1 <- 0.9
val2 <- 0.7
F_val <- 1
loop_seq <- c(1, 2, 3)
for(i in loop_seq){
for(j in loop_seq){
F_val <- F_val + my_function(val1-i)*my_function(val2-j)
}
}
我目前的解决方案是以下内容,但我并没有真正提高任何速度:
ret_value <- 0.5*apply(matrix(pmax(0,rep(y_vec,each=4)+c(0,-1,-2,-3))^2*c(1,-3,3,-1), ncol=length(y_vec)),2,sum)
我认为 **2
是时间的花费。用乘法
mff <- function(y) {
a <- if (y < 0.0) 0.0 else y
b <- if (y < 1.0) 0.0 else y-1.0
c <- if (y < 2.0) 0.0 else y-2.0
d <- if (y < 3.0) 0.0 else y-3.0
0.5*(a*a - 3.0*b*b + 3.0*c*c - d*d)
}
在我的机器上您的原始功能
> system.time(replicate(1e6, mf(0.7)))
user system elapsed
2.88 0.00 2.88
我的
> system.time(replicate(1e6, mff(0.7)))
user system elapsed
1.48 0.03 1.52
更新
也很容易用ifelse()
vecmff <- function(y) {
a <- ifelse(y < 0.0, 0.0, y)
b <- ifelse(y < 1.0, 0.0, y-1.0)
c <- ifelse(y < 2.0, 0.0, y-2.0)
d <- ifelse(y < 3.0, 0.0, y-3.0)
0.5*(a*a - 3.0*b*b + 3.0*c*c - d*d)
}