Одного разу я ознайомився з особливостями важливих для мене бібліотек Haskell і склав таблицю порівняння (лише електронна таблиця: пряме посилання ). Тому я спробую відповісти.
На основі якої я повинен вибрати між Vector.Unboxed та UArray? Вони обидва неосмислені масиви, але абстракція Vector здається сильно рекламованою, зокрема навколо злиття циклу. Чи вектор завжди кращий? Якщо ні, то коли я повинен використовувати яке представлення?
UArray може віддавати перевагу над Vector, якщо потрібні двовимірні або багатовимірні масиви. Але Vector має приємніший API для маніпулювання, ну, вектори. Взагалі, вектор не дуже підходить для імітації багатовимірних масивів.
Vector.Unboxed не можна використовувати з паралельними стратегіями. Я підозрюю, що UArray також не може бути використаний, але, принаймні, дуже просто перейти з UArray на бокс-масив і побачити, чи може паралелізація виграти на боксерські витрати.
Для кольорових зображень я хотів би зберегти тричі 16-бітових цілих чи трійки одноточних чисел з плаваючою комою. З цією метою чи простіший у використанні вектор, чи UArray? Більш виконавський?
Я спробував використовувати масиви для зображення зображень (хоча мені потрібні були лише зображення сірого масштабу). Для кольорових зображень я використовував бібліотеку Codec-Image-DevIL для читання / запису зображень (прив'язки до бібліотеки DevIL), для зображень у градаціях сірого я використовував бібліотеку pgm (чистий Haskell).
Моя основна проблема Array полягала в тому, що він забезпечує лише зберігання у довільному доступі, але він не забезпечує багато засобів побудови алгоритмів масиву, а також не має готових до використання бібліотек підпрограм масиву (не взаємодіє з лінійними лінійками алгебри, не так не дозволяють виражати згортки, ффти та інші перетворення).
Майже щоразу, коли новий масив повинен бути побудований з існуючого, повинен бути складений проміжний список значень (як при множенні матриць із "Ніжного вступу"). Вартість побудови масиву часто переважає переваги швидшого випадкового доступу до того, що представлення на основі списку швидше в деяких випадках мого використання.
STUArray міг би мені допомогти, але мені не сподобалось битися з криптовалютними помилками та зусиллями, необхідними для написання поліморфного коду за допомогою STUArray .
Отже, проблема з масивами полягає в тому, що вони не дуже підходять для чисельних обчислень. Hmatrix 'Data.Packed.Vector і Data.Packed.Matrix кращі в цьому відношенні, оскільки вони поставляються разом із суцільною бібліотекою матриць (увага: ліцензія GPL). Під час множення матриці hmatrix була достатньо швидкою ( лише трохи повільніше, ніж Octave ), але дуже голодною до пам'яті (споживалася в кілька разів більше, ніж Python / SciPy).
Існує також бібліотека blas для матриць, але вона не побудована на GHC7.
Я ще не мав великого досвіду роботи з Repa, і я не добре розумію код ремонту. Як я бачу, у нього є дуже обмежений діапазон готових до використання матричних і масивних алгоритмів, написаних поверх нього, але принаймні можна виразити важливі алгоритми засобами бібліотеки. Наприклад, вже є підпрограми для множення матриць і для згортання в алгоритмах репарації. На жаль, здається, що згортання зараз обмежене 7 × 7 ядрами (мені це недостатньо, але їх вистачить для багатьох застосувань).
Я не пробував прив'язки Haskell OpenCV. Вони повинні бути швидкими, оскільки OpenCV дійсно швидкий, але я не впевнений, чи прив'язки завершені та якісні, щоб бути зручними. Також OpenCV за своєю природою є дуже необхідним, наповненим руйнівними оновленнями. Я думаю, важко розробити приємний та ефективний функціональний інтерфейс. Якщо хтось піде шляхом OpenCV, він, швидше за все, буде використовувати зображення представлення OpenCV скрізь, і використовувати OpenCV підпрограми для маніпулювання ними.
Для бітональних зображень мені потрібно буде зберігати лише 1 біт на піксель. Чи є заздалегідь визначений тип даних, який може мені тут допомогти, упакувавши кілька пікселів у слово, чи я самостійно?
Наскільки я знаю, Unboxed масиви Bools піклуються про упаковку та розпакування бітових векторів. Я пам'ятаю, як дивився на реалізацію масивів Bools в інших бібліотеках, і не бачив цього в іншому місці.
Нарешті, мої масиви є двовимірними. Я думаю, я міг би мати справу з додатковою непрямістю, накладеною поданням як "масив масивів" (або вектор векторів), але я вважаю за краще абстракцію, яка має підтримку відображення індексів. Хтось може порекомендувати що-небудь із стандартної бібліотеки чи з Hackage?
Окрім Vector (та простих списків), всі інші бібліотеки масивів здатні представляти двовимірні масиви чи матриці. Я гадаю, вони уникають несподіваних непрямих дій.