2016-04-24 1 views
0

J'ai un fichier txt avec plusieurs matrices entières avec des dimensions différentes que je veux analyser dans une représentation de paquet hmatrix, mais je ne trouve aucune fonction appropriée. Le fichier texte contient la forme suivante:Comment analyser plusieurs matrices d'un seul fichier en hmatrix?

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

par exemple.

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

La chose la plus proche que j'ai trouvé readMatrix à:

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

mais comme il n'y a pas de documentation et je suis assez nouveau pour Haskell Je ne sais pas comment l'utiliser.

Répondre

1

Tant que les performances ne sont pas cruciales, il est plus facile de prétraiter d'abord les données sous forme de listes simples avant d'introduire des types spéciaux tels que les matrices. (Et si la performance est importante, vous ne devriez pas utiliser des fichiers texte!)

Alors d'abord

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

Ensuite, vous séparer de la structure. Dans ce cas, il vous suffit de prendre les deux premiers éléments de la liste de lignes, puis de regrouper les lignes restantes & agrave; 16. Eh bien, c'est à ce sujet, vous pouvez simplement jeter les [imbriqués] Double listes matrices:

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 
+0

Qu'en est-il 'se répète sans le savoir souvent fait partie? –

+0

Qu'est-ce que "et" à propos de ça? – leftaroundabout

+0

@ ДМИТРИЙМАЛИКОВ Le code de cette réponse fonctionne sur une chaîne qui représente l'intégralité du contenu du fichier. La fonction "consume" (c'est-à-dire examine chaque caractère) de la chaîne (à moins qu'elle ne rencontre une erreur) donc logiquement elle va analyser toutes les occurrences du modèle. En aparté, je suis un peu confus à propos du nom de 'chunksÀ' mais je suppose que c'est * l'identificateur de valeur avec' UnicodeSyntax'. – user2407038