问题
我正在寻找可能已经存在的 repa 库中的函数。我想要一个功能:
- 采用二维数组
- 指定窗口大小的两个整数
- 在二维数组上给定大小的每个窗口中,计算一个新值,例如该特定窗口中的小值。
例子
min
使用 3x3 窗口映射函数:
| 1 2 3 4 3 4 5 6 7 2 7 8 9 4 2 5 4 8 1 6 8 5 3 3 2 |
将返回:
| 1 1 2 2 2 1 1 2 2 2 4 4 1 1 1 4 3 1 1 1 4 3 1 1 1 |
请注意,我正在使用类似于BoundClamp 构造函数的方案Data.Array.Repa.Stencil
。这不是模板卷积,即它没有将模板应用于 2D 数组的每个元素。相反,它在数组的每个窗口上执行一个函数,边缘的超出范围的元素被分配到二维数组边缘的最接近的值。
可能解决方案的类型
该函数可能类似于:
mapF
:: Source r a
=> Boundary a -- ^ How to handle the boundary of the array.
-> (Int,Int) -- ^ window size in the X and Y direction.
-> (Array r DIM2 a -> b) -- ^ function over window e.g. to return the minimum value.
-> Array r DIM2 a -- ^ Array to apply function to.
-> Array r DIM2 b
这是已经存在的东西,还是编码起来很简单?