我正在通过尝试大量的编程示例来探索Haskell修复库.我的目标是使用repa实现常见的图像处理算法.
在repa存储库中有一些有用的代码示例.它们都在类型Array U DIM2 a或Array DIM2 Float或的图像上运行Array U DIM2 Double.
-- three image types used below
type Image = Array U DIM2 Double
type Image = Array DIM2 Float
type Image = Array U DIM2 (Word8, Word8, Word8)
-- examples/Blur/src-repa/Main.hs
blur :: Monad m => Int -> Array U DIM2 Double -> m (Array U DIM2 Double)
-- examples/Laplace/src-repa/SolverStencil.hs
solveLaplace :: Monad m => Int -> Array U DIM2 …Run Code Online (Sandbox Code Playgroud) 在Repa包中有模板,允许以方便的方式从相邻值计算值(对卷积,图像模糊,扩散模拟等有用).
在目前的维修包中,我可以制作任何形状的模板,但只能使用二维模板mapStencil2.有没有办法将模具应用于具有不同维度的数组?甚至没有办法应用一维模板.我正在寻找一种应用三维模板的方法.
谢谢
我对修复包中的select函数有点困惑:
select (\i -> True) (\i -> i) 10
Run Code Online (Sandbox Code Playgroud)
给出结果
[0,1,2,3,4,5,6,7,8]
Run Code Online (Sandbox Code Playgroud)
我以为我介于0到10或0和9之间.为什么介于0和8之间?
修理2.0.2.1
在Numeric Haskell Repa Tutorial Wiki中,有一段读取(用于上下文):
10.1融合,以及为什么需要它
修复主要取决于阵列融合以实现快速编码.Fusion是编译程序时GHC执行的内联和代码转换组合的一个奇特名称.融合过程将Repa库中定义的数组填充循环与您在自己的模块中编写的"worker"函数合并.如果融合过程失败,那么生成的程序将比它需要的慢得多,通常比使用普通Haskell列表的等效程序慢10倍.另一方面,如果提供融合工作,生成的代码将与等效的干净编写的C程序一样快.一旦了解了正在发生的事情,融合工作并不难.
我不明白的部分是:
"如果融合过程失败,那么生成的程序将比它需要的速度慢得多,通常比使用普通Haskell列表的等效程序慢10倍."
我理解为什么如果流融合失败会运行得慢,但为什么它比列表运行慢得多呢?
谢谢!
我想知道在维修中是否有类似的(//)?
无法并行化的数组转换需要它.例如,如果函数需要整个数组更改数组的单个条目,而不是将其应用于新数组等等(并且应该按顺序运行).
我正在编写代码来做一个子集产品:它需要一个元素列表和一个指标变量列表(长度相同).产品在树中计算,这对我们的应用至关重要.每个产品都很昂贵,因此我的目标是并行计算树的每个级别,按顺序评估连续级别.因此,没有任何嵌套并行性发生.
我只在一个函数中修复代码,接近我整个代码的顶层.请注意,subsetProd 不是 monadic .
步骤:
代码:
{-# LANGUAGE TypeOperators, FlexibleContexts, BangPatterns #-}
import System.Random
import System.Environment (getArgs)
import Control.Monad.State
import Control.Monad.Identity (runIdentity)
import Data.Array.Repa as Repa
import Data.Array.Repa.Eval as Eval
import Data.Array.Repa.Repr.Vector
force :: (Shape sh) => Array D sh e -> Array V sh e
force = runIdentity . computeP
chunk :: [a] -> [(a,a)]
chunk [] = []
chunk (x1:x2:xs) = (x1,x2):(chunk xs)
slow_fib :: Int -> Integer
slow_fib 0 …Run Code Online (Sandbox Code Playgroud) parallel-processing monads haskell repa data-parallel-haskell
我写了一些使用repa 计算距离矩阵的代码:
distance :: Int -> Int -> Mat -> Double
distance aindx bindx arr = let a = slice arr (Any :. aindx :. All)
b = slice arr (Any :. bindx :. All)-
sqdiff = R.map (\x -> x*x) $ R.zipWith (-) a b
in sqrt $ sumAllS sqdiff
buildDistanceMatrix :: Mat -> Mat
buildDistanceMatrix m = let (Z :. height :. width) = R.extent m
cords = fromListUnboxed (Z :. (height * height) ) [ (x,y) …Run Code Online (Sandbox Code Playgroud)