Подтвердить что ты не робот

Какую реализацию массива haskell использовать? AKA, какие плюсы и минусы каждого

Что мне нужно? [неупорядоченный список]

  • ОЧЕНЬ легкая распараллеливание
  • поддержка карты, фильтра и т.д.
  • способность эффективно выполнять вычисления на основе массивов, например A = B + C, вроде массивов matlab.
  • Генерация кода SIMD. Наверное, в ближайшем будущем об этом не может быть и речи, но я могу спросить:)
  • поддержка матриц должна быть там, как минимум, более высокие размеры имеют более низкий приоритет прямо сейчас.
  • возможность получить указатель на него и создать его с помощью указателя C.
  • Поддержка других библиотек. IE, привязки к популярным C-математическим пакетам, i/o на диск или изображения, если массивы 2D

Что я вижу?

  • Пакет массивов в haskell-платформе. Это благословенный и может выполнять параллельные
  • Data.Vector. Имеет петлевый слияние, но не в платформе, поэтому его зрелость мне неизвестна.
  • пакет repa, внесенный командой DPH, но не работает с любым стабильным ghc сегодня.
  • Множество вариаций в уровне поддержки реализации массивов. Например, не кажется, что это простой способ сбросить 2D-вектор в файл изображения. IOW, сообщество haskell, по-видимому, не остановилось на реализации массива.

Так что, пожалуйста, помогите мне выбрать.

РЕДАКТИРОВАТЬ A = B + C означает элементное дополнение, а не конкатенацию списка

4b9b3361

Ответ 1

Правильно, сообщество не остановилось на хорошей реализации массива. Я думаю, что было бы хорошим представлением Haskell Prime представить API-интерфейс Vector и удалить Data.Array.

Вектор очень зрелый! Он имеет:

  • ОЧЕНЬ легкое распараллеливание
  • поддержка map, фильтр и т.д.
  • эффективно выполняет вычисления на основе массивов, например A = B + C (но я не согласен с тем, как это делает Matlab).
  • создание вектора из указателя через Vector.Storable

Нет:

  • имеют достаточную поддержку из других библиотек. IE, привязки к популярным C-математическим пакетам
  • но вы можете иметь векторы векторов. Если вы создаете некоторые векторные операции на основе векторов, то, возможно, вы можете загрузить их в хакеры в виде векторной матрицы.
  • Сгенерировать код SIMD.

ПРИМЕЧАНИЕ. Вы можете превратить bytestrings в векторы любого, поэтому, если у вас есть изображение как bytestring, то, используя Vector.Storable, вы можете сделать то, что хотите, с изображением в качестве вектора.

Ответ 2

(мне не разрешено комментировать)

rpg: принимает ли hmatrix Data.Vector? Он имеет Data.Packed.Vector, но являются ли они одинаковыми?

Да. Последняя версия hmatrix использует по умолчанию Data.Vector.Storable для 1D векторов (ранее она была необязательной). Зависимость от вектора не отображается в Hackage, вероятно, потому, что она находится в флагом конфигурации.

Для матриц совместимости LAPACK нет Vector или Vector t, но их можно легко преобразовать (например: Data.Vector.fromList . toRows).

Ответ 3

Если вы хотите привязки к популярным библиотекам C, лучшие варианты, вероятно, hmatrix и blas. Blas - это просто привязка к библиотеке BLAS, тогда как hmatrix предоставляет некоторые операции более высокого уровня. Существует также множество библиотек, построенных на hmatrix, предлагающих дополнительную функциональность. Если вы выполняете какую-либо работу с матрицей, то с чего я начну.

Пакет векторов также является хорошим выбором; он стабилен и обеспечивает отличную производительность. Типы Data.Vector.Storable представлены как массивы C, поэтому тривиальным является интерфейс от них к другим библиотекам C. Самый большой недостаток заключается в том, что нет поддержки матрицы, поэтому вам придется сделать это самостоятельно.

Что касается экспорта в формат изображения, большинство библиотек изображений haskell, похоже, используют ByteStrings. Вы можете либо преобразовать в ByteString, либо привязать к библиотеке C, которая делает то, что вы хотите. Если вы найдете библиотеку Haskell, которая делает то, что вы хотите, должно быть достаточно легко преобразовать данные hmatrix в соответствующий формат.