C#中的滑动窗口算法

我试图在C#3.0中的二维数组上实现简单的滑动窗口算法,我发现它非常有用,但它只涉及单维数组。

该post还包括算法的代码,我完全没有将它用于我的senario …任何人都可以建议我如何进行?

场景:

http://sofzh.miximages.com/c%23/matrix.jpg http://sofzh.miximages.com/c%23/matrix.jpg

上面的图像是10X10矩阵,需要使用任何算法得到3X3矩阵(滑动窗口会很大)。 红色矩形是第一组,绿色是第二组。 它一直持续到所有行的结尾

PS:我用Google搜索算法,但没有运气:(

天真的实施:

private static IEnumerable GetWindows( 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[,] 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[,] 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) 

现在您所要做的就是应用与博客文章中显示的相同的技术:)