“for”循环不填充矩阵

时间:2015-06-04 18:30:27

标签: r for-loop

我用'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只获得第一个值。请更正代码。

3 个答案:

答案 0 :(得分:3)

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

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的索引,你的代码按预期工作。

答案 1 :(得分:0)

你可能想要

return(tr)

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

编辑:@josilber的回答要好得多。这个功能很容易被矢量化,如他所示。

答案 2 :(得分:0)

您没有告诉我们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