【问题标题】:Sparse arrays in Haskell?Haskell中的稀疏数组?
【发布时间】:2009-06-04 01:09:00
【问题描述】:

是否有任何标准或“最常用”的方式来表示 Haskell 中的多维稀疏数组(不会过多牺牲性能)?

例如 C++ 中的 map> 之类的东西。我在 Google 上搜索过,只找到了一些旧的学术论文,其他人也问过这个问题。

谢谢!

【问题讨论】:

    标签: arrays data-structures haskell


    【解决方案1】:

    Data.Map (Int,Int) MyClass 是一个很好的建议;先试试吧。

    如果您遇到空间问题,请尝试IntMap (IntMap MyClass)IntMaps(在模块Data.IntMap中)是Maps,以Ints为键;由于专业化,它们比通用地图更有效。它可能会或可能不会产生重大影响。

    还有可能对您有用的Scalable, adaptive persistent container types 项目。这些容器(包括贴图)使用的空间比法线贴图要少得多,但它们稍微复杂一些(尽管使用起来仍然相当容易)。

    【讨论】:

    • 谢谢!这对我来说真的很有用(我正在使用一些大型但稀疏数组的数值算法)。
    【解决方案2】:

    Data.Map (Int,Int) MyClass 怎么样?

    【讨论】:

      【解决方案3】:

      HsJudy,似乎是为稀疏键集量身定做的。

      用于 Haskell 的 Judy 绑定(实现快速稀疏动态数组的 C 库)提供尽可能符合现有 Haskell 库接口的 API,例如 Data.Map 和 Data.Array.MArray。 Judy 库的此绑定包括所有四种类型:从字到位 (Judy1)、从字到值 (JudyL)、从字符串到值 (JudyHS) 以及从字节数组到值 (JudyHS) 的映射。 /p>

      但我可能会选择Data.Map.Map (Int, Int) MyClass,直到遇到可扩展性或可用性问题。

      【讨论】:

      • 非常感谢! (给你和其他建议 Data.Map 的发帖人。我想我可能会遇到可扩展性问题,但无论如何我都会尝试 :-)
      【解决方案4】:
      【解决方案5】:

      我发现 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
      

      【讨论】:

        猜你喜欢
        • 2018-08-22
        • 1970-01-01
        • 1970-01-01
        • 2011-02-02
        • 2020-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-02
        相关资源
        最近更新 更多