Una volta ho esaminato le funzionalità delle librerie di array Haskell che sono importanti per me e ho compilato una tabella di confronto (solo foglio di calcolo: collegamento diretto ). Quindi cercherò di rispondere.
Su quale base dovrei scegliere tra Vector.Unboxed e UArray? Sono entrambi array unboxed, ma l'astrazione Vector sembra fortemente pubblicizzata, in particolare intorno alla fusione di loop. Vector è sempre migliore? In caso contrario, quando dovrei usare quale rappresentazione?
UArray può essere preferito a Vector se sono necessari array bidimensionali o multidimensionali. Ma Vector ha API migliori per manipolare, beh, i vettori. In generale, Vector non è adatto per la simulazione di array multidimensionali.
Vector.Unboxed non può essere utilizzato con strategie parallele. Sospetto che nemmeno UArray possa essere utilizzato, ma almeno è molto facile passare da UArray a boxed Array e vedere se i vantaggi della parallelizzazione superano i costi di boxing.
Per le immagini a colori, vorrei memorizzare triple di interi a 16 bit o triple di numeri in virgola mobile a precisione singola. A tal fine, Vector o UArray sono più facili da usare? Più performante?
Ho provato a utilizzare gli array per rappresentare le immagini (anche se avevo bisogno solo di immagini in scala di grigi). Per le immagini a colori ho utilizzato la libreria Codec-Image-DevIL per leggere / scrivere immagini (collegamenti alla libreria DevIL), per le immagini in scala di grigi ho usato la libreria pgm (Haskell puro).
Il mio problema principale con Array era che fornisce solo archiviazione ad accesso casuale, ma non fornisce molti mezzi per costruire algoritmi Array né viene fornito con librerie pronte per l'uso di routine di array (non si interfaccia con le librerie di algebra lineare, non non consentono di esprimere convoluzioni, fft e altre trasformazioni).
Quasi ogni volta che si deve costruire un nuovo Array da quello esistente, deve essere costruito un elenco intermedio di valori (come nella moltiplicazione di matrici dalla Gentle Introduction). Il costo della costruzione dell'array spesso supera i vantaggi di un accesso casuale più veloce, al punto che una rappresentazione basata su elenchi è più veloce in alcuni dei miei casi d'uso.
STUArray avrebbe potuto aiutarmi, ma non mi piaceva combattere con errori di tipo criptici e gli sforzi necessari per scrivere codice polimorfico con STUArray .
Quindi il problema con gli array è che non sono adatti per i calcoli numerici. Data.Packed.Vector e Data.Packed.Matrix di Hmatrix sono migliori sotto questo aspetto, perché sono dotati di una solida libreria a matrice (attenzione: licenza GPL). Dal punto di vista delle prestazioni, sulla moltiplicazione di matrici, hmatrix era sufficientemente veloce ( solo leggermente più lento di Octave ), ma molto affamato di memoria (consumato molte volte di più di Python / SciPy).
C'è anche la libreria blas per le matrici, ma non si basa su GHC7.
Non avevo ancora molta esperienza con Repa e non capisco bene il codice repa. Da quello che vedo ha una gamma molto limitata di algoritmi di matrice e array pronti all'uso scritti sopra, ma almeno è possibile esprimere algoritmi importanti per mezzo della libreria. Ad esempio, esistono già routine per la moltiplicazione di matrici e per la convoluzione negli algoritmi repa. Sfortunatamente, sembra che la convoluzione sia ora limitata a kernel 7 × 7 (non è abbastanza per me, ma dovrebbe essere sufficiente per molti usi).
Non ho provato i collegamenti Haskell OpenCV. Dovrebbero essere veloci, perché OpenCV è davvero veloce, ma non sono sicuro che i collegamenti siano completi e abbastanza buoni da essere utilizzabili. Inoltre, OpenCV per sua natura è molto imperativo, pieno di aggiornamenti distruttivi. Suppongo che sia difficile progettare un'interfaccia funzionale bella ed efficiente sopra di essa. Se uno usa OpenCV, è probabile che utilizzi la rappresentazione di immagini OpenCV ovunque e utilizzi le routine OpenCV per manipolarle.
Per le immagini bitonali dovrò memorizzare solo 1 bit per pixel. Esiste un tipo di dati predefinito che può aiutarmi qui comprimendo più pixel in una parola o sono da solo?
Per quanto ne so, gli array Unboxed di Bools si occupano di impacchettare e decomprimere i vettori di bit. Ricordo di aver guardato l'implementazione di array di Bools in altre librerie, e non l'ho visto altrove.
Infine, i miei array sono bidimensionali. Suppongo di poter gestire l'indirizzamento extra imposto da una rappresentazione come "array di array" (o vettore di vettori), ma preferirei un'astrazione che abbia il supporto per la mappatura dell'indice. Qualcuno può consigliare qualcosa da una libreria standard o da Hackage?
A parte Vector (e semplici elenchi), tutte le altre librerie di array sono in grado di rappresentare array o matrici bidimensionali. Suppongo che evitino indirette indirette inutili.