标签: repa

使用Haskell修复阵列库的彩色图像文件IO

我正在通过尝试大量的编程示例来探索Haskell修复库.我的目标是使用repa实现常见的图像处理算法.

修理例子

在repa存储库中有一些有用的代码示例.它们都在类型Array U DIM2 aArray 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)

haskell repa

5
推荐指数
1
解决办法
757
查看次数

如何应用具有任意尺寸的修复模板?

在Repa包中有模板,允许以方便的方式从相邻值计算值(对卷积,图像模糊,扩散模拟等有用).

在目前的维修包中,我可以制作任何形状的模板,但只能使用二维模板mapStencil2.有没有办法将模具应用于具有不同维度的数组?甚至没有办法应用一维模板.我正在寻找一种应用三维模板的方法.

谢谢

haskell repa

5
推荐指数
0
解决办法
93
查看次数

Haskell Repa ---选择函数有点混乱

我对修复包中的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

arrays haskell repa

4
推荐指数
1
解决办法
330
查看次数

修复绩效与列表

在Numeric Haskell Repa Tutorial Wiki中,有一段读取(用于上下文):

10.1融合,以及为什么需要它

修复主要取决于阵列融合以实现快速编码.Fusion是编译程序时GHC执行的内联和代码转换组合的一个奇特名称.融合过程将Repa库中定义的数组填充循环与您在自己的模块中编写的"worker"函数合并.如果融合过程失败,那么生成的程序将比它需要的慢得多,通常比使用普通Haskell列表的等效程序慢10倍.另一方面,如果提供融合工作,生成的代码将与等效的干净编写的C程序一样快.一旦了解了正在发生的事情,融合工作并不难.

我不明白的部分是:

"如果融合过程失败,那么生成的程序将比它需要的速度慢得多,通常比使用普通Haskell列表的等效程序慢10倍."

我理解为什么如果流融合失败会运行得慢,但为什么它比列表运行慢得多呢?

谢谢!

haskell ghc repa

4
推荐指数
1
解决办法
503
查看次数

在Repa中基本上是顺序的数组转换

我想知道在维修中是否有类似的(//)?

无法并行化的数组转换需要它.例如,如果函数需要整个数组更改数组的单个条目,而不是将其应用于新数组等等(并且应该按顺序运行).

haskell repa

3
推荐指数
1
解决办法
490
查看次数

并行维修代码不会产生火花

我正在编写代码来做一个子集产品:它需要一个元素列表和一个指标变量列表(长度相同).产品在树中计算,这对我们的应用至关重要.每个产品都很昂贵,因此我的目标是并行计算树的每个级别,按顺序评估连续级别.因此,没有任何嵌套并行性发生.

我只在一个函数中修复代码,接近我整个代码的顶层.请注意,subsetProd 不是 monadic .

步骤:

  1. 将列表分成对(没有并行性)
  2. 压缩分块列表(没有并行性)
  3. 将产品功能映射到此列表(使用Repa map),创建一个Delayed数组
  4. 调用computeP来并行计算地图
  5. 将Repa结果转换回列表
  6. 进行递归调用(在列表的一半大小的输入)

代码:

{-# 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

3
推荐指数
1
解决办法
500
查看次数

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)

haskell double-precision quickcheck repa

1
推荐指数
1
解决办法
144
查看次数