Однажды я рассмотрел важные для меня функции библиотек массивов Haskell и составил сравнительную таблицу (только электронная таблица: прямая ссылка ). Так что попробую ответить.
На каком основании мне выбирать между Vector.Unboxed и UArray? Оба являются распакованными массивами, но абстракция Vector, кажется, сильно разрекламирована, особенно в отношении слияния циклов. Вектор всегда лучше? Если нет, то когда мне следует использовать какое представление?
UArray может быть предпочтительнее Vector, если нужны двумерные или многомерные массивы. Но у Vector есть более приятный API для управления векторами. В общем, Vector не очень хорошо подходит для моделирования многомерных массивов.
Vector.Unboxed нельзя использовать с параллельными стратегиями. Я подозреваю, что UArray также нельзя использовать, но, по крайней мере, очень легко переключиться с UArray на массив в штучной упаковке и посмотреть, перевешивают ли преимущества распараллеливания затраты на упаковку.
Для цветных изображений я хочу хранить тройки 16-битных целых чисел или тройки чисел с плавающей запятой одинарной точности. Что для этого проще использовать: Vector или UArray? Более производительный?
Я пробовал использовать массивы для представления изображений (хотя мне нужны были только изображения в оттенках серого). Для цветных изображений я использовал библиотеку Codec-Image-DevIL для чтения / записи изображений (привязки к библиотеке DevIL), для изображений в оттенках серого я использовал библиотеку pgm (чистый Haskell).
Моя основная проблема с Array заключалась в том, что он предоставляет только хранилище с произвольным доступом, но он не предоставляет многих средств для построения алгоритмов Array и не поставляется с готовыми к использованию библиотеками процедур массива (не взаимодействует с библиотеками линейной алгебры, не не позволяют выражать свертки, fft и другие преобразования).
Почти каждый раз, когда новый массив должен быть построен из существующего, должен быть построен промежуточный список значений (как в умножении матриц из мягкого введения). Стоимость построения массива часто перевешивает преимущества более быстрого произвольного доступа до такой степени, что представление на основе списка работает быстрее в некоторых из моих сценариев использования.
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?
Кроме вектора (и простых списков), все другие библиотеки массивов могут представлять двумерные массивы или матрицы. Я полагаю, они избегают ненужного косвенного обращения.