Sau khi tôi xem xét các tính năng của thư viện mảng Haskell quan trọng đối với tôi và biên soạn một bảng so sánh (chỉ bảng tính: liên kết trực tiếp ). Vì vậy, tôi sẽ cố gắng trả lời.
Tôi nên chọn giữa Vector.Unboxed và UArray trên cơ sở nào? Cả hai đều là mảng không được đóng hộp, nhưng phần trừu tượng Vector có vẻ được quảng cáo rất nhiều, đặc biệt là xung quanh phép hợp vòng lặp. Vector luôn tốt hơn? Nếu không, khi nào tôi nên sử dụng biểu diễn nào?
UArray có thể được ưu tiên hơn Vector nếu người ta cần mảng hai chiều hoặc nhiều chiều. Nhưng Vector có API đẹp hơn để thao tác, tốt, vectơ. Nói chung, Vector không thích hợp để mô phỏng mảng nhiều chiều.
Vector.Unboxed không thể được sử dụng với các chiến lược song song. Tôi nghi ngờ rằng UArray không thể được sử dụng, nhưng ít nhất rất dễ dàng để chuyển từ UArray sang Mảng đóng hộp và xem liệu việc song song có lợi hơn so với chi phí quyền anh hay không.
Đối với hình ảnh màu, tôi sẽ muốn lưu trữ bộ ba số nguyên 16 bit hoặc bộ ba số dấu phẩy động chính xác đơn. Với mục đích này, Vector hoặc UArray có dễ sử dụng hơn không? Biểu diễn hơn?
Tôi đã thử sử dụng Mảng để biểu diễn hình ảnh (mặc dù tôi chỉ cần hình ảnh thang độ xám). Đối với hình ảnh màu, tôi đã sử dụng thư viện Codec-Image-DevIL để đọc / ghi hình ảnh (liên kết với thư viện DevIL), đối với hình ảnh thang độ xám, tôi đã sử dụng thư viện pgm (Haskell thuần túy).
Vấn đề lớn của tôi với Array là nó chỉ cung cấp lưu trữ truy cập ngẫu nhiên, nhưng nó không cung cấp nhiều phương tiện để xây dựng thuật toán Array cũng như không đi kèm với các thư viện sẵn sàng sử dụng các quy trình mảng (không giao diện với lib đại số tuyến tính, không 'không cho phép thể hiện các biến đổi chập, fft và các biến đổi khác).
Hầu như mỗi khi Mảng mới phải được tạo từ Mảng hiện có, một danh sách các giá trị trung gian phải được xây dựng (giống như trong phép nhân ma trận từ Giới thiệu Nhẹ nhàng). Chi phí xây dựng mảng thường lớn hơn lợi ích của việc truy cập ngẫu nhiên nhanh hơn, đến mức biểu diễn dựa trên danh sách nhanh hơn trong một số trường hợp sử dụng của tôi.
STUArray có thể đã giúp tôi, nhưng tôi không thích đấu tranh với các lỗi kiểu khó hiểu và những nỗ lực cần thiết để viết mã đa hình với STUArray .
Vì vậy, vấn đề với Mảng là chúng không phù hợp cho các phép tính số. Về mặt này, Hmatrix 'Data.Packed.Vector và Data.Packed.Matrix tốt hơn vì chúng đi kèm với một thư viện ma trận vững chắc (chú ý: giấy phép GPL). Về hiệu suất, trên phép nhân ma trận, hmatrix đủ nhanh ( chỉ chậm hơn Octave một chút ), nhưng rất ngốn bộ nhớ (tiêu thụ nhiều hơn Python / SciPy vài lần).
Ngoài ra còn có thư viện blas cho ma trận, nhưng nó không xây dựng trên GHC7.
Tôi chưa có nhiều kinh nghiệm về Repa và tôi không hiểu rõ về mã repa. Từ những gì tôi thấy, nó có rất hạn chế về các thuật toán ma trận và mảng sẵn sàng sử dụng được viết trên đó, nhưng ít nhất nó có thể diễn đạt các thuật toán quan trọng bằng phương tiện của thư viện. Ví dụ, đã có các quy trình cho phép nhân ma trận và cho phép tích chập trong các thuật toán lặp lại. Thật không may, có vẻ như tích chập bây giờ bị giới hạn ở các hạt nhân 7 × 7 (đối với tôi nó không đủ, nhưng sẽ đủ cho nhiều mục đích sử dụng).
Tôi đã không thử liên kết Haskell OpenCV. Chúng phải nhanh, vì OpenCV thực sự nhanh, nhưng tôi không chắc liệu các ràng buộc có hoàn chỉnh và đủ tốt để có thể sử dụng được hay không. Ngoài ra, OpenCV về bản chất của nó là rất bắt buộc, chứa đầy các bản cập nhật phá hoại. Tôi cho rằng thật khó để thiết kế một giao diện chức năng đẹp mắt và hiệu quả. Nếu một người đi theo cách OpenCV, anh ta có thể sử dụng biểu diễn hình ảnh OpenCV ở mọi nơi và sử dụng các quy trình OpenCV để thao tác chúng.
Đối với hình ảnh bitonal, tôi sẽ chỉ cần lưu trữ 1 bit trên mỗi pixel. Có loại dữ liệu được xác định trước có thể giúp tôi ở đây bằng cách đóng gói nhiều pixel thành một từ hay tôi tự làm không?
Theo như tôi biết, các mảng Bools Unboxed đảm nhận việc đóng gói và giải nén các vectơ bit. Tôi nhớ đã xem xét việc triển khai các mảng Bools trong các thư viện khác và không thấy điều này ở nơi khác.
Cuối cùng, mảng của tôi là hai chiều. Tôi cho rằng tôi có thể đối phó với việc bổ sung hướng dẫn được áp đặt bởi một biểu diễn là "mảng của mảng" (hoặc vectơ của vectơ), nhưng tôi thích một phần trừu tượng có hỗ trợ ánh xạ chỉ mục. Bất cứ ai có thể giới thiệu bất cứ điều gì từ một thư viện tiêu chuẩn hoặc từ Hackage?
Ngoài Vector (và các danh sách đơn giản), tất cả các thư viện mảng khác đều có khả năng biểu diễn các mảng hoặc ma trận hai chiều. Tôi cho rằng họ tránh chuyển hướng không cần thiết.