减少简单功能的计算时间

  • 本文关键字:计算 时间 功能 简单 r
  • 更新时间 :
  • 英文 :


我有一个简单的功能,称为数百次。有什么方法可以提高其计算速度?

# 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)
}

最新更新