2016-10-18 18 views
0

黒い背景に白い傷がある画像をシミュレートする必要があります。だから私はすべての要素がゼロに等しい行列をいくつか連続した点を1に加えた関数を定義しました。 機能は以下の通りです:'[< - `(` * tmp * `、i、succ、value = 1)のエラー:添え字が範囲外です

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))) 

ほとんどの場合、結果は正しいです。しかし、いくつかのケースでは、私はこのエラーに遭遇:

Error in [<- (*tmp* , i, succ, value = 1) : subscript out of bounds

答えて

1

この2行:

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 

、あなたは割り当て=または<-を使用する必要がある場合は、平等テスト==を使用しました。

エラーメッセージは、それが行列をオフに行くの要素でなければならなかった私に言ったので、私はsuccの値をプリントアウトし始め、それが右の範囲内でリセットされていなかった、とだけその後、が私をした気づきました間違いを見つけてください。私はおそらく気づかずにコードを10回見ました。私はまた、そのような種類のエラーは小さな行列で起こりやすいと考えていたので、6x6の行列でテストしたところ、64x64よりも見やすくなりました!

+0

ちょうど数秒後に正確に同じ回答を投稿したかったのです。 ;-)小さな行列についての良いコメント。私はそれを追跡する別の方法を持っていました:forループでスクリプトをラップし、それが壊れることを望みました。 (これはかなり高速でした)。デバッガは等価テストの行の1行下で停止し、次に '=='が即座に見えました。 – symbolrush

+0

これでいいです。ありがとう! –

関連する問題