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

How to parse multiple matrices from single file to hmatrix?

我有一个 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 还很陌生,所以我不知道如何使用它。

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

那么先

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

然后你分离结构。在这种情况下,您只需专门获取行列表的前两个元素,然后将剩余的行分块 à 16。好吧,仅此而已,然后您可以简单地将 [nested] 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