【问题标题】:"for" loop is not populating the matrix“for”循环没有填充矩阵
【发布时间】:2015-06-04 18:30:26
【问题描述】:

我正在使用“for”循环计算每个点的角度。但不知何故,矩阵没有按需要填充。只有矩阵中的第一个元素填充了计算值。

w1 = c(-2.40154, -1.82937)
w2 = c(-2.079041, 101,0663)
xy = as.data.frame(coordinates(p))
angle  = function (w1, w2 , p, ...) {
   iterations = 2500
   a = sqrt ((w1[1]-w2[1])^2 + (w1[2]-w2[2])^2)
   tr <- matrix(ncol=1, nrow=iterations)
  for (i in 1:iterations) { 
    b[i] = sqrt ((p$coords.x1[i]-w1[1])^2 + (p$coords.x2[i]-w1[2])^2)
    c[i] = sqrt ((p$coords.x1[i]-w2[1])^2 + (p$coords.x2[i]-w2[2])^2)
    tr[i,] = (acos ((b[i]^2 + c[i]^2 - a^2)/ (2*b[i]*c[i]))*180)/pi
    print(tr)   
  }
  return(tr)
}
t = angle(w1,w2,xy)

tr 仅获得第一个值。请更正代码。

【问题讨论】:

  • 您的return(tr) 不应该在for 循环之外吗?否则只会发生一次迭代。此外,您似乎正在为每次迭代覆盖tr。这是你的意图吗?
  • 看起来您的括号不匹配。此外,您可能应该将 tr 放在循环之外。
  • 你想把tr &lt;- matrix(ncol=1, nrow=iterations)放在iterations = 2500之后

标签: r for-loop


【解决方案1】:

通常您不想循环遍历一次执行一个索引的向量。相反,您希望对整个向量进行操作。这将使您的代码更短更高效:

w1 = c(-2.40154, -1.82937)
w2 = c(-2.079041, 101,0663)
p <- data.frame(coords.x1=c(4, 5), coords.x2=c(6, 7))
angle <- function(w1, w2, p) {
  a <- sqrt ((w1[1]-w2[1])^2 + (w1[2]-w2[2])^2)
  b <- sqrt ((p$coords.x1-w1[1])^2 + (p$coords.x2-w1[2])^2)
  c <- sqrt ((p$coords.x1-w2[1])^2 + (p$coords.x2-w2[2])^2)
  return(matrix((acos ((b^2 + c^2 - a^2)/ (2*b*c))*180)/pi, ncol=1))
}
angle(w1, w2, p)
#          [,1]
# [1,] 137.0681
# [2,] 135.7206

基本上我所做的只是删除了 for 循环和i 的索引,您的代码按预期工作。

【讨论】:

    【解决方案2】:

    你可能想要

    return(tr)
    

    在所有通过for循环完成之后,而不是在第一次通过它时。

    编辑:@josilber 的回答要好得多。正如他所展示的,这个函数很容易矢量化。

    【讨论】:

    • 好吧,我猜你还需要在 for 循环之前定义 tr
    【解决方案3】:

    你没有告诉我们 p 是如何定义的。如果你坚持使用你的代码,迭代需要依赖于 p 的行。

    w1 = c(-2.40154, -1.82937)
    w2 = c(-2.079041, 101.0663)
    p <- data.frame(coords.x1=c(4, 5,3), coords.x2=c(6, 7,5))
    xy = as.data.frame(p)
    angle1  = function (w1, w2 , p, ...) {
      iterations = nrow(p)
      b<-c<-vector()
      tr <- matrix(ncol=1, nrow=iterations)
      a = sqrt ((w1[1]-w2[1])^2 + (w1[2]-w2[2])^2)
    
      for (i in 1:iterations) { 
        b[i] = sqrt ((p$coords.x1[i]-w1[1])^2 + (p$coords.x2[i]-w1[2])^2)
        c[i] = sqrt ((p$coords.x1[i]-w2[1])^2 + (p$coords.x2[i]-w2[2])^2)    
        tr[i,] = (acos ((b[i]^2 + c[i]^2 - a^2)/ (2*b[i]*c[i]))*180)/pi
        #print(tr)
        }
      return(tr)
    }
    t = angle1(w1,w2,xy)
    head(t)
    
             [,1]
    [1,] 137.0707
    [2,] 135.7236
    [3,] 138.6321
    

    【讨论】:

    • 谢谢罗伯特。指出点。但是,'p' 有无数记录,出于测试目的,我只想迭代合理的次数。所以我定义了迭代 = 2500。重要的是,我在这里学到的是 R 中的向量不必像传统编程语言中的数组那样进行迭代。而且我不坚持使用我的代码。
    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 2013-01-19
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多