2009-07-27 8 views
1

私は、C#3.0で2次元配列の単純なスライディングウィンドウアルゴリズムを実装しようとしています。が非常に便利だとわかりましたが、それは単一次元配列しか伴いません。Sliding window algorithm in C#

The postも私のシナリオでは使用できませんでした...どのように進めていいですか?

シナリオ:

http://parasu516.googlepages.com/matrix.jpg http://parasu516.googlepages.com/matrix.jpg

上記画像は、10×10行列であり、(ウィンドウをスライドさせることgreateのであろう)任意のアルゴリズムを使用して、そのうちの3×3行列を取得する必要があります。赤い矩形は最初のセットで、緑の矩形は2番目のセットです。そしてそれは、すべての行

PS用の最後までになります:私はアルゴについてググませんが、運:(

+0

を適用しているあなたは、あなたが、シナリオが何であるかを詳しく説明することはできますか?多くのスライディングウィンドウが使用されています。 – EFraim

+0

は、私はあなたの窓は、x軸の端に当たったときに何が起こるかをより明瞭 –

+0

ための画像表現が含まれて? – Pondidum

答えて

2

ナイーブな実装:二次元配列の間でコピーする

private static IEnumerable<T[,]> GetWindows<T>(
    T[,] array, 
    int windowWidth, 
    int windowHeight) 
{ 
    for (var y = 0; y < array.GetLength(1) - windowHeight + 1; y++) 
    { 
     for (var x = 0; x < array.GetLength(0) - windowWidth + 1; x++) 
     { 
      var slice = new T[windowWidth, windowHeight]; 
      CopyArray(array, x, y, slice, 0, 0, windowWidth, windowHeight); 
      yield return slice; 
     } 
    } 
} 

ヘルパーメソッドメイン

private static void CopyArray<T>(
    T[,] src, int srcX, int srcY, 
    T[,] dst, int dstX, int dstY, 
    int width, int height) 
{ 
    for (var x = 0; x < width; x++) 
    { 
     for (var y = 0; y < height; y++) 
     { 
      dst[dstX + x, dstY + y] = src[srcX + x, srcY + y]; 
     } 
    } 
} 

試験:

private static void Main(string[] args) 
{ 
    var array = new string[5, 5]; 
    for (var y = 0; y < array.GetLength(1); y++) 
    { 
     for (var x = 0; x < array.GetLength(0); x++) 
     { 
      array[x, y] = string.Format("({0}|{1})", x, y); 
     } 
    } 
    foreach (var window in GetWindows(array, 3, 3)) 
    { 
     ShowArray(window); 
    } 
    Console.ReadLine(); 
} 

private static void ShowArray<T>(T[,] array) 
{ 
    for (var x = 0; x < array.GetLength(0); x++) 
    { 
     for (var y = 0; y < array.GetLength(1); y++) 
     { 
      Console.Write(" {0}", array[x, y]); 
     } 
     Console.WriteLine(); 
    } 
    Console.WriteLine(); 
} 

出力:

(0|0) (0|1) (0|2) 
(1|0) (1|1) (1|2) 
(2|0) (2|1) (2|2) 

(1|0) (1|1) (1|2) 
(2|0) (2|1) (2|2) 
(3|0) (3|1) (3|2) 

(2|0) (2|1) (2|2) 
(3|0) (3|1) (3|2) 
(4|0) (4|1) (4|2) 

(0|1) (0|2) (0|3) 
(1|1) (1|2) (1|3) 
(2|1) (2|2) (2|3) 

(1|1) (1|2) (1|3) 
(2|1) (2|2) (2|3) 
(3|1) (3|2) (3|3) 

(2|1) (2|2) (2|3) 
(3|1) (3|2) (3|3) 
(4|1) (4|2) (4|3) 

(0|2) (0|3) (0|4) 
(1|2) (1|3) (1|4) 
(2|2) (2|3) (2|4) 

(1|2) (1|3) (1|4) 
(2|2) (2|3) (2|4) 
(3|2) (3|3) (3|4) 

(2|2) (2|3) (2|4) 
(3|2) (3|3) (3|4) 
(4|2) (4|3) (4|4) 

は、今あなたがしなければならないすべてはそのブログ記事に示されているのと同じ手法:)

+0

おかげで返送されます... :) –

+0

それは13 windowSizeで512×512行列を処理するために、ほとんど時間がかかる、任意の範囲は改善のためにそこにある –

+0

繰り返し行われていればCopyArrayは非常に高価です。単純な最適化は、各ウィンドウの代わりに、ウィンドウ自体のためのX/Yのペアを返す生成するであろう。 – dtb