나에게 중요한 Haskell 배열 라이브러리의 기능을 검토하고 비교 테이블을 컴파일 했습니다 (스프레드 시트 만 : direct link ). 그래서 나는 대답하려고 노력할 것입니다.
Vector.Unboxed와 UArray 중에서 어떤 기준을 선택해야합니까? 둘 다 unboxed 배열이지만 벡터 추상화는 특히 루프 융합과 관련하여 많이 광고되는 것처럼 보입니다. Vector는 항상 더 나은가요? 그렇지 않은 경우 언제 어떤 표현을 사용해야합니까?
2 차원 또는 다차원 배열이 필요한 경우 UArray가 Vector보다 선호 될 수 있습니다. 그러나 Vector는 벡터를 조작하기위한 더 좋은 API를 가지고 있습니다. 일반적으로 Vector는 다차원 배열을 시뮬레이션하는 데 적합하지 않습니다.
Vector.Unboxed는 병렬 전략과 함께 사용할 수 없습니다. 나는 UArray를 둘 다 사용할 수 없다고 생각하지만, 적어도 UArray에서 boxed Array로 전환하고 병렬화가 boxing 비용을 능가하는 이점이 있는지 확인하는 것은 매우 쉽습니다.
컬러 이미지의 경우 16 비트 정수의 트리플 또는 단 정밀도 부동 소수점 숫자의 트리플을 저장하려고합니다. 이를 위해 Vector 또는 UArray가 사용하기 더 쉬울까요? 더 많은 성능?
이미지를 표현하기 위해 배열을 사용해 보았습니다 (그레이 스케일 이미지 만 필요했지만). 컬러 이미지의 경우 Codec-Image-DevIL 라이브러리를 사용하여 이미지를 읽고 / 씁니다 (DevIL 라이브러리에 바인딩), 회색조 이미지의 경우 pgm 라이브러리 (순수 Haskell)를 사용했습니다.
Array의 주요 문제는 랜덤 액세스 스토리지 만 제공한다는 것이지만, Array 알고리즘을 구축하는 많은 수단을 제공하지 않으며 배열 루틴 라이브러리를 사용할 준비가되어 있지도 않습니다 (선형 대수 라이브러리와 인터페이스하지 않고 컨볼 루션, fft 및 기타 변환을 표현할 수 없습니다).
기존 배열에서 새 배열을 만들어야 할 때마다 중간 값 목록 을 구성해야합니다 (예 : Gentle Introduction의 행렬 곱셈 에서). 배열 구성 비용은 종종 내 사용 사례 중 일부에서 목록 기반 표현이 더 빠르다는 점까지 더 빠른 임의 액세스의 이점보다 중요합니다.
STUArray가 도움이 될 수 있었지만 STUArray를 사용하여 다형성 코드 를 작성하는 데 필요한 수수께끼 유형 오류 및 노력과 싸우는 것을 좋아하지 않았습니다 .
따라서 배열의 문제는 수치 계산에 적합하지 않다는 것입니다. Hmatrix의 Data.Packed.Vector 및 Data.Packed.Matrix는 솔리드 매트릭스 라이브러리 (주의 : GPL 라이센스)와 함께 제공되기 때문에이 점에서 더 좋습니다. 성능면에서 행렬 곱셈에서 hmatrix는 충분히 빠르지 만 ( Octave보다 약간 느리지 만 ) 메모리가 많이 소모되었습니다 (Python / SciPy보다 몇 배 더 많이 소비 됨).
매트릭스에 대한 blas 라이브러리도 있지만 GHC7을 기반으로 빌드되지 않습니다.
나는 아직 Repa에 대한 경험이 많지 않았고 repa 코드를 잘 이해하지 못합니다. 내가보기에는 그 위에 작성된 행렬 및 배열 알고리즘을 사용할 준비가 된 매우 제한된 범위가 있지만 적어도 라이브러리를 통해 중요한 알고리즘을 표현할 수 있습니다. 예를 들어, 행렬 곱셈과 repa- 알고리즘의 컨볼 루션 에 대한 루틴이 이미 있습니다 . 불행히도 컨볼 루션은 이제 7x7 커널로 제한되는 것 같습니다 (나에게는 충분하지 않지만 많은 용도로 충분할 것입니다).
Haskell OpenCV 바인딩을 시도하지 않았습니다. OpenCV는 정말 빠르기 때문에 빠르지 만 바인딩이 완전하고 사용할 수있을만큼 좋은지 확실하지 않습니다. 또한 OpenCV는 본질적으로 매우 필수적이고 파괴적인 업데이트로 가득합니다. 그 위에 멋지고 효율적인 기능적 인터페이스를 디자인하는 것은 어렵다고 생각합니다. OpenCV 방식으로 가면 그는 모든 곳에서 OpenCV 이미지 표현을 사용하고 OpenCV 루틴을 사용하여 조작 할 수 있습니다.
흑백 이미지의 경우 픽셀 당 1 비트 만 저장하면됩니다. 여러 픽셀을 한 단어로 압축하여 여기에 도움이 될 수있는 사전 정의 된 데이터 유형이 있습니까? 아니면 제가 혼자입니까?
내가 아는 한 Unboxed Bool 배열은 비트 벡터 압축 및 압축 해제 를 처리합니다. 다른 라이브러리에서 Bool 배열의 구현을 살펴본 것을 기억하고 다른 곳에서는 이것을 보지 못했습니다.
마지막으로, 내 배열은 2 차원입니다. 나는 "배열의 배열"(또는 벡터의 벡터)과 같은 표현에 의해 부과 된 추가 간접적 인 것을 다룰 수 있다고 생각하지만 인덱스 매핑을 지원하는 추상화를 선호합니다. 누구든지 표준 라이브러리 나 Hackage에서 추천 할 수 있습니까?
벡터 (및 단순 목록) 외에도 다른 모든 배열 라이브러리는 2 차원 배열 또는 행렬을 나타낼 수 있습니다. 나는 그들이 불필요한 간접적 인 방향을 피한다고 생각합니다.