Какую реализацию массива 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 означает элементное дополнение, а не конкатенацию списка
Ответы
Ответ 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 в соответствующий формат.