首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在软件R中没有"for“的情况下高效地编程?

如何在软件R中没有"for“的情况下高效地编程?
EN

Stack Overflow用户
提问于 2018-12-30 23:41:48
回答 1查看 81关注 0票数 0

我试图在没有一个"for“的情况下更有效地开发程序,但是当我删除一个循环时,时间就会增加。

我做错什么了?

请不要关注结果,因为这些数字是象征性的,我在"for“里面有更多的代码。我需要改进这条线:“问题线”。

尝试1需要1.7秒

尝试2需要9s

代码语言:javascript
复制
nSteps = 200; p=0.45

v = data.frame(matrix(0,nrow=nSteps+1,ncol=nSteps+1))
v[nSteps+1,] <- rep(0.2,nSteps+1)

check = data.frame(matrix(15,nrow=nSteps+1,ncol=nSteps+1))

#################
### attempt 1 ###
    #################

   for ( m in nSteps:0){
    for (n in 1:(m+1)){
        hold = (1-p)*v[m+1,n]+p*v[m+1,n+1] #### problem line
        v[m,n] = ifelse(check[m,n]>=0,max(check[m,n],hold),max(hold,0))
    # more code here...     
    }
}

#################
### attempt 2 ###
    #################

seq1 = 1:nSteps
seq2 = 2:(nSteps+1)
for ( m in (nSteps:1)){
    vec = (1-p)*v[m+1,seq1]+p*v[m+1,seq2] ##### problem line
    v[m,]<-c(t(vec),0)
    # more code here... 
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-31 03:57:30

我快速地看了一下,似乎可以通过将data.frame更改为data.matrix来提高它的性能。

在一般矩阵中,性能要比数据帧好得多,请检查以下内容

https://csgillespie.github.io/efficientR/7-1-data-types.html#matrix

我不知道你想做什么.

例如,以下操作(标量乘以矩阵,乘以向量)使用数据矩阵显著加快

代码语言:javascript
复制
DF <- data.frame(a = 1:3, b = 4:6,c = 7:9)
V <- data.frame(a = 10:12)

dm <- data.matrix(DF)
dv <- data.matrix(V)

DFl <- list()
dml <- list()

system.time(
  for ( m in 2500:1){
    DFl[[m]] <-( 3 * DF * V[,1])
  }
)

system.time(
  for ( m in 2500:1){
    dml[[m]] <- (  3 * dm * dv[1])
  }
)

第一种情况,如果通过改变矩阵(大约快3倍)的速度大大加快的话。

运行以下返回

尝试1

用户系统运行

2.11 0.00 2.11

企图1a

用户系统运行

0.690.00 0.69

企图2

用户系统运行

8.60 0.00 8.63

尝试3

代码语言:javascript
复制
user  system elapsed 

0.02 0.00 0.02

比较结果

真的

代码语言:javascript
复制
library(compare)
nSteps = 200; p=0.45

v = data.frame(matrix(0,nrow=nSteps+2,ncol=nSteps+2))

#CS added extra row, looks like the logic was assuming that out of range DF returns NULL and errors subscript out of bounds on data.matrix

v[nSteps+1,] <- rep(0.2,nSteps+1)
vtemp <- v

check = data.frame(matrix(15,nrow=nSteps+1,ncol=nSteps+1))


#################
### attempt 1 ###
#################
v<- vtemp 
system.time(
for ( m in nSteps:0){
  for (n in 1:(m+1)){
    hold = (1-p)*v[m+1,n]+p*v[m+1,n+1] #### problem line
    v[m,n] = ifelse(check[m,n]>=0,max(check[m,n],hold),max(hold,0))
    # more code here...     
  }
}
)
v1 <- v

#################
### attempt 1a ###
#################
v<- vtemp 
check2 = matrix(15,nrow=nSteps+1,ncol=nSteps+1)
v1a <- data.matrix(v) 
system.time(
  for ( m in nSteps:0){
    for (n in 1:(m+1)){
      hold = (1-p)*v1a[m+1,n]+p*v1a[m+1,n+1] #### problem line
      v1a[m,n] = ifelse(check[m,n]>=0,max(check[m,n],hold),max(hold,0))
      # more code here...     
    }
  }
)

v1a <- data.frame(v1a)
compare(v1,v1a)



#################
### attempt 2 ###
#################

v = data.frame(matrix(0,nrow=nSteps+1,ncol=nSteps+1))
v[nSteps+1,] <- rep(0.2,nSteps+1)
vtemp <- v


seq1 = 1:nSteps
seq2 = 2:(nSteps+1)
system.time(
for ( m in (nSteps:1)){
  vec = (1-p)*v[m+1,seq1]+p*v[m+1,seq2] ##### problem line
  v[m,]<-c(t(vec),0)
  # more code here... 
}
)
v2 <- v

#################
### attempt 3 ###
#################

seq1 = 1:nSteps
seq2 = 2:(nSteps+1)

v3 <- data.matrix(vtemp)
#note Matrix index is 0 based
system.time(
  for ( m in (nSteps:0)){
    vec = (1-p) * v3[m+1,seq1] + p * v3[m+1,seq2] ##### problem line
    v3[m,]<-c(t(vec),0)
    # more code here... 
  }
)
v3 <- data.frame(v3)

compare(v2,v3)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53982339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档