2016-12-16 12 views
0

私はこのようなバイナリラスタを持っている:ラスタの再帰アルゴリズムまたはフラッドフィリングアルゴリズム?

101101 
010111 
101011 
111101 

は、今私は、行で、この行を実行する必要があります(!の行のセルのみ) 行を通過し、1ある隣接するセルを数えます。そして私はこのようなベクトルなどを取得したいと思います。それ以上のラスタの例えば は、次のようになります。

1st row: 1 2 1 

2nd row: 1 3 

3rd row: 1 1 2 

4th row: 4 1 

私は上の洪水充填アルゴリズムについて多くを読んで。しかし、私はちょうどそれを正しくしません。

私はこの再帰アルゴリズム試してみました:

rec=function(x) 
    {if (x==0) 
     {return 0) 
    else return(1+rec(x+1))} 

をしかし、それは働いていません。

答えて

0

rleを試してみることができます。

xy <- read.table(text = "1 0 1 1 0 1 
0 1 0 1 1 1 
1 0 1 0 1 1 
1 1 1 1 0 1", sep = "") 
xy 

apply(xy, MARGIN = 1, FUN = function(x) { 
    x <- rle(x) 
    x$lengths[x$values == 1] 
}) 

[[1]] 
V2 V5  
1 2 1 

[[2]] 
V3  
1 3 

[[3]] 
V2 V4  
1 1 2 

[[4]] 
V5  
4 1 
0

フラッドフィルアルゴリズムはまったく必要ありません。再帰も必要ありません。

ゼロ以外を数えてください。最も簡単な状態マシン:

Starting state in the beginning of every line is 0 
When state is 0 and you meet 1, remember X-position Start and make state 1 
When state is 1 and you meet 0, make state 0 and add `Current - Start` to list 
In other cases do nothing 
+0

okありがとうございます。私はそれを試み、それは小さなラスターのために働いた。しかし、私は大きなラスタ(180x480)に対処しなければならず、時間がかかります。たぶん、私のバージョンだけでは十分に効率的ではありません。 – Cocilein

+0

このアルゴリズムは可能な限り最良の実行時間を持っています。すべてのラスター要素を一度だけ訪問します。それはどんな妥当なラスタサイズでもすばらしく速くなるはずです。 – MBo

関連する問題