Проблема
Я ищу функцию в библиотеке repa, которая может уже существовать. Мне нужна функция, которая:
- Принимает 2D-массив
- Два целых числа, определяющие размер окна
- В каждом окне заданного размера над двумерным массивом вычислите новое значение, например. маленькое значение в этом конкретном окне.
Пример
Сопоставление функции 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
. Это не свертка трафарета, т. е. трафарет не применяется к каждому элементу двумерного массива. Вместо этого он выполняет функцию в каждом окне массива, при этом элементам вне диапазона на краях присваивается ближайшее значение на краю двумерного массива.
Тип возможного решения
Функция может выглядеть примерно так:
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
Это что-то, что либо уже существует, либо было бы тривиально закодировать?
traverse
не позволяет мне указать, что происходит на границах 2D-массива, например. указать BoundClamp. Кроме того,traverse
будет означать, что я должен программно построить окно вокруг каждого элемента, чтобы вычислитьmin
. Эта деталь абстрагируется с помощью функции трафарета в repa. - person Rob Stewart   schedule 12.05.2014