【发布时间】:2009-06-04 01:09:00
【问题描述】:
是否有任何标准或“最常用”的方式来表示 Haskell 中的多维稀疏数组(不会过多牺牲性能)?
例如 C++ 中的 map> 之类的东西。我在 Google 上搜索过,只找到了一些旧的学术论文,其他人也问过这个问题。
谢谢!
【问题讨论】:
标签: arrays data-structures haskell
是否有任何标准或“最常用”的方式来表示 Haskell 中的多维稀疏数组(不会过多牺牲性能)?
例如 C++ 中的 map> 之类的东西。我在 Google 上搜索过,只找到了一些旧的学术论文,其他人也问过这个问题。
谢谢!
【问题讨论】:
标签: arrays data-structures haskell
Data.Map (Int,Int) MyClass 是一个很好的建议;先试试吧。
如果您遇到空间问题,请尝试IntMap (IntMap MyClass)。 IntMaps(在模块Data.IntMap中)是Maps,以Ints为键;由于专业化,它们比通用地图更有效。它可能会或可能不会产生重大影响。
还有可能对您有用的Scalable, adaptive persistent container types 项目。这些容器(包括贴图)使用的空间比法线贴图要少得多,但它们稍微复杂一些(尽管使用起来仍然相当容易)。
【讨论】:
Data.Map (Int,Int) MyClass 怎么样?
【讨论】:
有HsJudy,似乎是为稀疏键集量身定做的。
用于 Haskell 的 Judy 绑定(实现快速稀疏动态数组的 C 库)提供尽可能符合现有 Haskell 库接口的 API,例如 Data.Map 和 Data.Array.MArray。 Judy 库的此绑定包括所有四种类型:从字到位 (Judy1)、从字到值 (JudyL)、从字符串到值 (JudyHS) 以及从字节数组到值 (JudyHS) 的映射。 /p>
但我可能会选择Data.Map.Map (Int, Int) MyClass,直到遇到可扩展性或可用性问题。
【讨论】:
我发现 this short gist 显示了 Haskell 的压缩行存储和相关的矩阵向量乘法:
import Data.Vector.Unboxed as U
-- | A compressed row storage (CRS) sparse matrix.
data CRS a = CRS {
crsValues :: Vector a
, colIndices :: Vector Int
, rowIndices :: Vector Int
} deriving (Show)
multiplyMV :: CRS Double -> Vector Double -> Vector Double
multiplyMV CRS{..} x = generate (U.length x) outer
where outer i = U.sum . U.map inner $ U.enumFromN start (end-start)
where inner j = (crsValues ! j) * (x ! (colIndices ! j))
start = rowIndices ! i
end = rowIndices ! (i+1)
(!) a b = unsafeIndex a b
【讨论】: