情况
目前我正在做一个处理边缘检测的项目。因此,我想使用加速数组来计算算法以获得更好的性能。不幸的是,我对函数式编程以及并行编程还是很陌生,我真的不知道什么是正确的方法。
问题
要将给定图像转换为灰度甚至执行边缘检测,我需要访问数组的每个像素/值。
使用非加速数组(Data.Array 包)我可以使用 (!)-operator 来获得所需的值。
使用加速数组(Data.Array.Accelerate 包)有类似的功能,如 ..
(!) :: (Shape ix, Elt e) => Acc (Array ix e) -> Exp ix -> Exp e
描述:从数组中提取标量的表达式形式
(!!) :: (Shape ix, Elt e) => Acc (Array ix e) -> Exp Int -> Exp e
描述:从线性索引处的数组中提取标量的表达式形式
..但他们总是以返回 Accelerates 的表达式值结束,(Exp e)
这导致了我的问题..
问题
是否可以从Exp
数据类型中“解包”值,或者您还建议我做什么?
例子
从图像转换为加速数组的作品..
toArr :: Image PixelRGB8 -> Acc (Array DIM2 (Pixel8, Pixel8, Pixel8))
toArr img = use $ fromFunction (Z :. width :. height) (\(Z :. x :. y) -> let (PixelRGB8 r g b) = pixelAt img x y in (r, g, b))
where width = imageWidth img
height = imageHeight img
..但我不知道反之亦然,因为我需要访问表达式值以从宽度/高度/像素生成图像。
toJuicy :: Acc (Array DIM2 (Pixel8, Pixel8, Pixel8)) -> Image PixelRGB8
toJuicy arr = undefined
任何帮助将不胜感激。