0

在 Repa (Haskell) 中有没有办法直接执行行操作?

我想对二维数组的每一行做一个 fft,但这似乎是不可能的。由于我不想编写自己的 fft 算法,因此如果我可以将 fft(来自 Repa.FFTW)直接应用于每一行,从而产生与原始矩阵大小相同的矩阵,那就太好了。

我尝试编写自己的 dft 函数,但性能非常糟糕。代码如下。

dftOnMatrix :: Array D DIM2 Complex -> Array D DIM2 Complex
dftOnMatrix arr =
  let (Z :. rs :. cs) = extent arr
      dftFunc :: (DIM2 -> Complex) -> Int -> Int -> Int -> Complex -> Complex
      dftFunc f i j k sum = dftFuncCore k sum
        where
          val2 = fromIntegral j
          temp = 2*pi/ fromIntegral cs
          dftFuncCore k sum = 
            if k == cs
            then sum
            else let val1 = fromIntegral k
                     val = val1*val2*temp
                     cosval = ( - (cos val))
                     sinval = ( - (sin val))
                 in --cosval `seq` (sinval `seq` (dftFuncCore (k+1) (sum + ((f (Z :. i :. k))* (cos val, sin val)))))
                   dftFuncCore (k+1) (sum + ((f (Z :. i :. k))* (cos val, sin val)))
  in R.traverse arr id (\f (Z :. i :. j) -> (1/fromIntegral cs, 0) * dftFunc f i j 0 0)

我尝试使用 ghc-core 对此进行分析,但没有发现任何可能影响性能的内容。尽管我对核心的了解非常有限,但我可能完全错了。

谢谢,

4

0 回答 0