【问题标题】:-- How to start a loop with a first guess?-- 如何以第一个猜测开始循环?
【发布时间】:2011-04-17 04:51:54
【问题描述】:

这是 comp sci 101 的东西,但我找不到适用于 R(或 matlab)的答案。

我有一个for 循环,我想用第一次猜测来初始化(这里全为零,但以后可能会有别的东西),但我想在每次迭代中不断更新。我在下面的工作,但它有点笨重和尴尬。

我想避免在for 循环之前进行一次迭代。我可以在循环内使用ifelse 来做到这一点,但这似乎效率低下。谢谢!

alpha <- 0.3
beta <- 0.6
m <- 5 # elements in k
n <- 10 # iterations
k.prime <- v <- matrix(0, n, m)
k <- seq(from=0.04, to=0.2, length.out=m) # poss values for k
colnames(v) <- colnames(k.prime) <- round(k, digits=2)

# first loop for taking the first guess for v()
i <- 1
for (j in 1:m) {
    temp.v <- log(k[j]^alpha - k) + beta*rep(0, times=m)
    v[i, j] <- max(temp.v)
    k.prime[i, j] <- k[which.max(temp.v)]
}

# remaining loops
for (i in 2:n) {
    for (j in 1:m) {
        temp.v <- log(k[j]^alpha - k) + beta*v[i-1, ]
        v[i, j] <- max(temp.v)
        k.prime[i, j] <- k[which.max(temp.v)]
    }
}

v 
k.prime

【问题讨论】:

  • 我也对 matlab 解决方案持开放态度。两者有不同的循环行为吗?除了简单的语法差异之外,它们不是示例 re 循环和矩阵吗?
  • 只是对于不熟悉R的人来说,很难理解代码。如果您发布它的 MATLAB 版本可能会有所帮助...另一方面,您能否准确解释代码试图实现的目标?
  • 好点。出门在外,但我应该做一个 MATLAB 版本......我不应该给寻求帮助的 MATLABers 带来额外的负担。谢谢!
  • 哦,代码试图找到v(k) 的数值解,其中v(k_t) = log(k_t^alpha - k_t+1) + beta*v(k_t+1)。这是第一天动态编程的东西(即宏观经济学)。

标签: r loops for-loop


【解决方案1】:

用零初始化v[1,],删除第一个循环并将i索引修复为i+1别处。
这应该看起来像这样:

alpha<-0.3
beta<-0.6
m<-5 #elements in k
n<-10 #iterations
k.prime<-matrix(0,n,m);
v<-matrix(0,n+1,m);
k<-seq(from=0.04,to=0.2,length.out=m) #poss values for k
colnames(v)<-colnames(k.prime)<-round(k,digits=2)


v[1,]<-rep(0,m);

# remaining loops
for(i in 1:n){
    for(j in 1:m){
        temp.v<-log(k[j]^alpha-k)+beta*v[i,]
        v[i+1,j]<- max(temp.v)
        k.prime[i,j]<-k[which.max(temp.v)]
    }
}
v[-1,]->v; #Cleanup of 0-row

v 
k.prime

【讨论】:

  • 谢谢!我考虑了这一点,但认为可能有比扔掉第一排更好的方法。但我认为丢弃第一行比ifelse 更好。
【解决方案2】:

只要做:

for (i in 1:n) {
    for (j in 1:m) {
        if (i == 1) 
            temp.v <- log(k[j]^alpha - k) + beta*rep(0, times=m)
        else
            temp.v <- log(k[j]^alpha - k) + beta*v[i-1, ]
        v[i, j] <- max(temp.v)
        k.prime[i, j] <- k[which.max(temp.v)]
    }
}

【讨论】:

  • 我真的怀疑在任何现代系统上if 会以明显的方式降低性能(除非我们在这里谈论纳秒......),尤其是n=10m=5
  • @nico :是的,if-else 确实会降低性能,因为这是每次都必须检查的条件。我也怀疑 OP 的真正问题是否具有这个简单示例的维度。
  • @Joris Meys:当然,如果 n=100000 和 m=50000 可能会放慢速度,但话又说回来,我仍然怀疑 if 会是那里的瓶颈。可以进行更好的优化,例如避免调用 which.maxmax(当只调用一次 which.max 就足够了)。
  • @nico @joris -- 这是家庭作业,所以实际上是十次迭代,但我正在展望未来,并努力从第一天开始培养技能。 ifelse 似乎不能很好地扩展。感谢您指出我可以拨打which.max 一次并用一块石头杀死两只鸟。而且我认为我通过使用临时变量来避免计算两次是很狡猾的!这么多要学。谢谢!
  • @richardh :如果您正在尝试培养技能,您可能需要阅读这份特殊文档:burns-stat.com/pages/Tutor/R_inferno.pdf。它包含很多有用的代码优化技巧。干杯。
猜你喜欢
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
相关资源
最近更新 更多