Setelah saya meninjau fitur pustaka array Haskell yang penting bagi saya, dan menyusun tabel perbandingan (hanya spreadsheet: tautan langsung ). Jadi saya akan mencoba menjawab.
Atas dasar apa saya harus memilih antara Vector.Unboxed dan UArray? Keduanya adalah array yang tidak dikotakkan, tetapi abstraksi Vektor tampaknya banyak diiklankan, khususnya di sekitar fusi loop. Apakah Vector selalu lebih baik? Jika tidak, kapan saya harus menggunakan representasi yang mana?
UArray mungkin lebih disukai daripada Vektor jika seseorang membutuhkan array dua dimensi atau multi-dimensi. Tetapi Vector memiliki API yang lebih bagus untuk memanipulasi, ya, vektor. Secara umum, Vector tidak cocok untuk simulasi array multi-dimensi.
Vector.Unboxed tidak dapat digunakan dengan strategi paralel. Saya menduga UArray juga tidak dapat digunakan, tetapi setidaknya sangat mudah untuk beralih dari UArray ke Array kotak dan melihat apakah manfaat paralelisasi lebih besar daripada biaya tinju.
Untuk gambar berwarna, saya ingin menyimpan tiga kali lipat bilangan bulat 16-bit atau tiga kali lipat angka floating-point presisi tunggal. Untuk tujuan ini, apakah Vector atau UArray lebih mudah digunakan? Lebih berkinerja?
Saya mencoba menggunakan Array untuk merepresentasikan gambar (meskipun saya hanya membutuhkan gambar grayscale). Untuk gambar berwarna saya menggunakan pustaka Codec-Image-DevIL untuk membaca / menulis gambar (mengikat ke pustaka DevIL), untuk gambar grayscale saya menggunakan pgm library (Haskell murni).
Masalah utama saya dengan Array adalah ia hanya menyediakan penyimpanan akses acak, tetapi tidak menyediakan banyak cara untuk membangun algoritme Array juga tidak dilengkapi dengan perpustakaan rutinitas array yang siap digunakan (tidak berinteraksi dengan perpustakaan aljabar linier, bukan tidak memungkinkan untuk mengekspresikan konvolusi, fft dan transformasi lainnya).
Hampir setiap kali Array baru harus dibangun dari Array yang sudah ada, daftar nilai antara harus dibuat (seperti perkalian matriks dari Pendahuluan Lembut). Biaya konstruksi larik sering kali melebihi manfaat dari akses acak yang lebih cepat, sampai-sampai representasi berbasis daftar lebih cepat dalam beberapa kasus penggunaan saya.
STUArray dapat membantu saya, tetapi saya tidak suka berkelahi dengan kesalahan jenis samar dan upaya yang diperlukan untuk menulis kode polimorfik dengan STUArray .
Jadi masalah dengan Array adalah Array tidak cocok untuk perhitungan numerik. Hmatrix 'Data.Packed.Vector dan Data.Packed.Matrix lebih baik dalam hal ini, karena mereka datang bersama dengan perpustakaan matriks yang solid (perhatian: lisensi GPL). Dari segi performa, pada perkalian matriks, hmatrix cukup cepat ( hanya sedikit lebih lambat dari Oktaf ), tetapi sangat haus memori (dikonsumsi beberapa kali lebih banyak daripada Python / SciPy).
Ada juga pustaka blas untuk matriks, tetapi tidak dibangun di atas GHC7.
Saya belum memiliki banyak pengalaman dengan Repa, dan saya tidak memahami kode repa dengan baik. Dari apa yang saya lihat, ia memiliki rentang yang sangat terbatas dari matriks siap pakai dan algoritme larik yang ditulis di atasnya, tetapi setidaknya dimungkinkan untuk mengekspresikan algoritme penting melalui perpustakaan. Misalnya, sudah ada rutinitas untuk perkalian matriks dan konvolusi dalam algoritma repa. Sayangnya, tampaknya konvolusi sekarang terbatas pada kernel 7 Ă— 7 (ini tidak cukup bagi saya, tetapi seharusnya cukup untuk banyak kegunaan).
Saya tidak mencoba pengikatan OpenCV Haskell. Mereka harus cepat, karena OpenCV sangat cepat, tetapi saya tidak yakin apakah binding sudah lengkap dan cukup bagus untuk dapat digunakan. Selain itu, OpenCV pada dasarnya sangat penting, penuh dengan pembaruan yang merusak. Saya kira sulit untuk mendesain antarmuka fungsional yang bagus dan efisien di atasnya. Jika salah satu menggunakan cara OpenCV, dia cenderung menggunakan representasi gambar OpenCV di mana-mana, dan menggunakan rutinitas OpenCV untuk memanipulasinya.
Untuk gambar bitonal saya hanya perlu menyimpan 1 bit per piksel. Apakah ada tipe data standar yang dapat membantu saya di sini dengan mengemas beberapa piksel menjadi satu kata, atau saya sendiri?
Sejauh yang saya tahu, array Bools yang tidak dikotak menangani pengepakan dan pembongkaran vektor bit. Saya ingat melihat implementasi array Bools di perpustakaan lain, dan tidak melihatnya di tempat lain.
Akhirnya, array saya adalah dua dimensi. Saya kira saya bisa menangani tipuan ekstra yang dikenakan oleh representasi sebagai "array array" (atau vektor vektor), tetapi saya lebih suka abstraksi yang memiliki dukungan pemetaan indeks. Adakah yang bisa merekomendasikan sesuatu dari perpustakaan standar atau dari Hackage?
Selain Vektor (dan daftar sederhana), semua pustaka array lainnya mampu mewakili array atau matriks dua dimensi. Saya kira mereka menghindari tipu muslihat yang tidak perlu.