如何从一维列表创建一个二维未装箱数组?

4

Repa提供了 fromListUnboxed 函数,可以使用值列表创建1维数组。但是如果我有一组相等长度的1维未打包数组列表,如何创建一个二维数组呢?

2个回答

1
使用reshape函数:reshape :: (Shape sh1,Shape sh2,Source r1 e) => sh2 -> Array r1 sh1 e -> Array D sh2 e。这是编译时操作(没有运行时开销)。

1
但是你首先必须连接这些数组,不是吗?这会产生运行时成本,并且还需要考虑如何处理长度。 - leftaroundabout
2
未装箱的数组存储在内存块中,因此您必须保留该块以填充数据。如果您有一组这样的块(1D数组),则必须将内存复制到新的更大块中-无论您在此处使用Haskell、C++还是任何其他高性能语言。如果您想从1D列表创建2D数组,则必须将所有这些1D的数据复制到新的保留内存块中。 "如何处理长度"是什么意思? - Wojciech Danilo
他可能指的是数组不是按大小索引的事实。 - dfeuer
听起来不错。有没有内置的方法可以连接一组等长的数组? - Petr

0

我也遇到了这个问题。我通过将数组列表转换为未装箱的向量,连接它们,然后再转换回repa数组来解决了这个问题。非常笨拙,但这是我能想到的方法。

import           Data.Array.Repa     as R
import           Data.Vector.Unboxed as V
import           Prelude             as P

arrs = P.replicate 5 $ fromListUnboxed (ix1 10) [0..9 :: Int]

main = print concatenatedArrs
  where vectors = P.map toUnboxed arrs
        concatenatedVectors = V.concat vectors
        concatenatedArrs = fromUnboxed (R.ix2 5 10) concatenatedVectors

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接