【问题标题】:Error in `[<-`(`*tmp*`, i, succ, value = 1) : subscript out of bounds`[<-`(`*tmp*`, i, succ, value = 1) 中的错误:下标越界
【发布时间】:2016-10-18 15:43:57
【问题描述】:

我必须在黑色背景上模拟带有白色裂纹的图像。所以我定义了一个函数,它将所有元素都等于零的矩阵添加到一些连续的点等于一。 函数如下:

crepa<-function(matrice) {
 start<-sample(1:ncol(matrice),1)
 matrice[1,start]<-1
 for (i in 2:nrow(matrice)) {
  alpha<-sample(c(-1,0,1),1)
  succ<-start+alpha
  if (succ==(ncol(matrice)+1)) succ==ncol(matrice)
  if (succ==0) succ==1
  matrice[i,succ]<-1
  start<-succ
 }
 matrice<-as.matrix(matrice)
 }

为了控制函数是否运行良好,我将它一遍又一遍地应用于以下矩阵:

 m<-matrix(0,64,64)
 imma<-crepa(m)

 par(mar=rep(0,4))
 image(t(imma), axes = FALSE, col = grey(seq(0, 1, length = 256)))

在大多数情况下,结果是正确的。但是,在少数情况下我会遇到此错误:

[&lt;-(*tmp*, i, succ, value = 1) 中的错误:下标越界

【问题讨论】:

    标签: r function subscript


    【解决方案1】:

    这两行:

      if (succ==(ncol(matrice)+1)) succ==ncol(matrice)
      if (succ==0) succ==1
    

    应该是:

      if (succ==(ncol(matrice)+1)) succ=ncol(matrice)
      if (succ==0) succ=1
    

    如果你仍然看不到它,你应该使用赋值 = 或 &lt;- 时使用了相等测试 ==。

    错误消息告诉我它必须是离开矩阵的元素,所以我开始打印出succ 的值,然后注意到它没有在正确的范围内重置,只有 我发现错误了吗。我可能在没有注意到的情况下看了十遍代码。我还发现这种错误更可能出现在小矩阵中,因此使用 6x6 矩阵进行了测试,这意味着我更有可能看到它而不是使用 64x64!

    【讨论】:

    • 我想在几秒钟后发布完全相同的答案。 ;-) 关于小矩阵的好评论。我有另一种追踪它的方法:将脚本包装在一个 for 循环中,并希望它会中断。 (它做得很快..)调试器在相等测试的行下方停止了一行,然后我立即看到了==。
    • 现在好了。谢谢!
    猜你喜欢
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多