只要性能不重要,在引入任何特殊类型(如矩阵)之前,首先将数据预处理为简单列表是最简单的。(如果性能确实很重要,您不应该使用文本文件!)
所以首先
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