0

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

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

例如

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

我发现的最接近的地方是readMatrix

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

但由于没有文档,而且我对 Haskell 还很陌生,我不知道如何使用它。

4

1 回答 1

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
于 2016-04-24T11:25:23.567 回答