我有一个带有几个不同维度的整数矩阵的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:
但由于没有文档,我对Haskell相当新,我不知道如何使用它。
答案 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