【问题标题】:subscript out of bounds error with two for loops inside the function函数内部有两个 for 循环的下标越界错误
【发布时间】:2014-04-18 01:27:01
【问题描述】:

我正在尝试使用二维矩阵来生成二维矩阵结果,其中 每次我更改函数中的值时,都会以新的方式确定行数和列数,该函数相应地确定行数和列数。 我想问和解决“下标越界”问题的函数如下:

 HRC <- function(n,b,c)
 { 
 R=matrix( ,nrow = n*b, ncol = c)
 R[0,]=133
 for (j in 1:c)
 {
 r=rnorm(n*b)
 for (i in 1:n*b){
 R[i+1,j]=R[i,j]+3*b/r[i]
 }
 }
 return(R)
 }

 HRC(10,1,3)

我得到的错误信息如下:

 Error in R[i + 1, j] = R[i, j] + 3 * b/r[i] : subscript out of bounds

我想知道如何解决这个问题。非常感谢您。

【问题讨论】:

    标签: r function for-loop matrix dimension


    【解决方案1】:

    R 的索引从 1 开始,而不是 0。

    您还必须注意运算符优先级规则:: 运算符的优先级高于 *。见?Syntax。

    这应该可行:

    HRC <- function(n, b, c) { 
      R <- matrix(NA, nrow = n*b, ncol = c)
      R[1,]=133
      for (j in 1:c) {
        r = rnorm(n*b)
        for (i in 1:(n*b-1)){
          R[i+1,j] = R[i,j] + 3*b/r[i]
        }
      }
      return(R)
    }
    
    HRC(10,1,3)
    

    【讨论】:

    • 非常感谢!这真的是一个巨大的帮助!
    【解决方案2】:

    问题是您从行b 循环到行n*b(步幅b,由于* 和: 的优先级)然后索引到一个更大的,所以你尝试R 的索引行 n*b + 1,超出范围。

    R[0,]&lt;- 将导致不正确的结果,但不会从 R 中引发错误。

    如果您从2 循环到n*b(行数),我发现代码更易于阅读,并根据从行i-1 创建行i 编写公式(而不是创建行@ 987654333@ 来自行 i)。

    此外,您可以通过对行上的操作进行矢量化来删除一个循环维度:

    HRC <- function(n, b, c) { 
      R <- matrix(NA, nrow = n*b, ncol = c)
      R[1,] <- 133
    
      r <- matrix(rnorm(n*b*c), ncol=c)
      for (i in 2:(n*b)){
        R[i,] <- R[i-1,] + 3*b/r[i-1,]
      }
    
      return(R)
    }
    
    
    HRC(10,1,3)
    

    在这里,使用rnorm 获取相同数量的随机样本,但它们形成一个矩阵,并以与问题中使用的顺序相同的顺序使用。请注意,并非所有随机值都实际用于计算。

    如果你设置一个随机种子然后运行这个函数,以及@flodel 答案中的函数,你会得到相同的结果。他的回答也是正确的。

    【讨论】:

    • 非常感谢您对索引和清晰的解释做出了非常清晰的说明!我真的是一个巨大的帮助!非常感谢!
    【解决方案3】:

    我认为你犯了三个错误:

    首先:您弄乱了索引上的行数。应该是1:(n*b) 而不是1:n*b。

    第二:在R中,索引从1开始。所以R[0,]应该替换为R[1,]。

    第三:您在1:c 和1:(n:b) 的右边界运行循环,但您可能没有跟踪索引。

    试试这个:

    set.seed(100)
    HRC <- function(n, b, c) { 
      R <- matrix(0, nrow = n*b, ncol = c)
      R[1,] <- 133
      for (j in 1:c) {
        r <- rnorm(n*b)
        for (i in 2:(n*b)){
          R[i,j] <- R[i-1,j] + 3*b/r[i-1]
        }
      }
      return(R)
    }
    
    HRC(10,1,3)
    

    最后,我想提醒您注意赋值运算符的可互换使用。见here。

    【讨论】:

    • 非常感谢您更清楚地说明它!我真的很感激!非常感谢!
    猜你喜欢
    • 2014-08-31
    • 1970-01-01
    • 2017-05-12
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多