在 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 对此进行分析,但没有发现任何可能影响性能的内容。尽管我对核心的了解非常有限,但我可能完全错了。
谢谢,