如何从单个文件解析多个矩阵到hmatrix?

时间:2016-04-24 10:58:45

标签: file parsing haskell matrix hmatrix

我有一个带有几个不同维度的整数矩阵的txt文件,我想将其解析为hmatrix包表示,但我找不到任何合适的函数。文本文件包含以下格式:

[single-value]
[single-row 1x10 matrix]
[16x16 square-matrix]
repeats unknowingly often

e.g。

9
1 2 3 ..
9 8 7 6 5 ...
.
.
4 3 2 1 0 ..
...

我发现最接近的是readMatrix at:

https://hackage.haskell.org/package/hmatrix-0.17.0.1/docs/Numeric-LinearAlgebra-Devel.html#v:readMatrix

但由于没有文档,我对Haskell相当新,我不知道如何使用它。

1 个答案:

答案 0 :(得分:1)

只要性能不是至关重要的,在引入任何特殊类型(如矩阵)之前,最简单的方法是首先将数据预处理为简单列表。 (如果性能很重要,则不应使用文本文件!)

首先

readAllNumbers :: String -> [[Double]]
readAllNumbers = map (map read . words) . lines

然后你分开结构。在这种情况下,你只需要特别选择行列表的前两个元素,然后将其余的行组合成16个。那就是它,你可以简单地将[嵌套] Double列表转换为矩阵:

parseMContents :: String -> (Double, (HMat.Matrix, [HMat.Matrix]))
parseMContents s = case readAllNumbers s of
     [singleValue] : singleRow : rest
           -> (singleValue, ( HMat.fromLists [singleRow]
                            , HMat.fromLists <$> chunksÀ 16 rest ) )
     _ -> error "Matrix file has wrong format!"

chunksÀ :: Int -> [a] -> [[a]]
chunksÀ n ls = case splitAt n ls of
            (hs:[]) -> [hs]
            (hs:ts) -> hs : chunksÀ n ts