Uma vez eu revisei os recursos das bibliotecas de array Haskell que são importantes para mim e compilei uma tabela de comparação (apenas planilha: link direto ). Vou tentar responder.
Com base em que devo escolher entre Vector.Unboxed e UArray? Ambos são arrays unboxed, mas a abstração Vector parece muito anunciada, principalmente em torno da fusão de loops. O Vector é sempre melhor? Se não, quando devo usar qual representação?
UArray pode ser preferido em vez de Vector se for necessário arrays bidimensionais ou multidimensionais. Mas o Vector tem uma API melhor para manipular, bem, vetores. Em geral, o Vector não é adequado para simular matrizes multidimensionais.
Vector.Unboxed não pode ser usado com estratégias paralelas. Suspeito que o UArray também não possa ser usado, mas pelo menos é muito fácil alternar do UArray para o Array encaixotado e ver se os benefícios da paralelização superam os custos de encaixotamento.
Para imagens coloridas, desejarei armazenar triplos de números inteiros de 16 bits ou triplos de números de ponto flutuante de precisão única. Para este propósito, o Vector ou o UArray são mais fáceis de usar? Mais desempenho?
Tentei usar Arrays para representar imagens (embora precisasse apenas de imagens em tons de cinza). Para imagens coloridas, usei a biblioteca Codec-Image-DevIL para ler / gravar imagens (vinculações à biblioteca DevIL), para imagens em tons de cinza usei a biblioteca pgm (Haskell puro).
Meu maior problema com Array é que ele fornece apenas armazenamento de acesso aleatório, mas não fornece muitos meios de construir algoritmos de Array nem vem com bibliotecas prontas para usar de rotinas de array (não faz interface com bibliotecas de álgebra linear, não permite expressar convoluções, fft e outras transformações).
Quase toda vez que um novo Array deve ser construído a partir do existente, uma lista intermediária de valores deve ser construída (como na multiplicação de matrizes da Introdução Suave). O custo da construção do array geralmente supera os benefícios do acesso aleatório mais rápido, a ponto de uma representação baseada em lista ser mais rápida em alguns dos meus casos de uso.
STUArray poderia ter me ajudado, mas eu não gosto de lutar com erros de tipo enigmático e os esforços necessários para escrever código polimórfico com STUArray .
Portanto, o problema com os Arrays é que eles não são adequados para cálculos numéricos. Data.Packed.Vector e Data.Packed.Matrix da Hmatrix são melhores nesse aspecto, pois vêm acompanhados de uma biblioteca de matriz sólida (atenção: licença GPL). Em termos de desempenho, na multiplicação de matrizes, hmatrix era suficientemente rápido ( apenas um pouco mais lento que o Octave ), mas com muita fome de memória (consumia várias vezes mais que Python / SciPy).
Também existe uma biblioteca blas para matrizes, mas não se baseia no GHC7.
Ainda não tinha muita experiência com Repa e não entendo bem o código de repa. Pelo que vejo, ele tem uma gama muito limitada de algoritmos de matriz e array prontos para uso escritos em cima dele, mas pelo menos é possível expressar algoritmos importantes por meio da biblioteca. Por exemplo, já existem rotinas para multiplicação de matrizes e para convolução em algoritmos de reposição. Infelizmente, parece que a convolução agora está limitada a kernels 7 × 7 (não é o suficiente para mim, mas deve bastar para muitos usos).
Eu não tentei ligações Haskell OpenCV. Eles devem ser rápidos, porque o OpenCV é muito rápido, mas não tenho certeza se as ligações são completas e boas o suficiente para serem utilizadas. Além disso, o OpenCV por sua natureza é muito importante, cheio de atualizações destrutivas. Suponho que seja difícil projetar uma interface funcional agradável e eficiente em cima disso. Se alguém seguir o caminho do OpenCV, provavelmente usará a representação da imagem OpenCV em todos os lugares e usará as rotinas OpenCV para manipulá-las.
Para imagens bitonais, terei de armazenar apenas 1 bit por pixel. Existe um tipo de dados predefinido que pode me ajudar aqui, reunindo vários pixels em uma palavra, ou estou sozinho?
Até onde eu sei, os arrays não encaixotados de Bools cuidam de empacotar e descompactar vetores de bits. Lembro-me de olhar para a implementação de matrizes de Bools em outras bibliotecas e não vi isso em outro lugar.
Finalmente, meus arrays são bidimensionais. Suponho que poderia lidar com a indireção extra imposta por uma representação como "matriz de matrizes" (ou vetor de vetores), mas prefiro uma abstração que tenha suporte para mapeamento de índice. Alguém pode recomendar algo de uma biblioteca padrão ou do Hackage?
Além de Vector (e listas simples), todas as outras bibliotecas de array são capazes de representar arrays ou matrizes bidimensionais. Suponho que evitem vias indiretas desnecessárias.