Haskell dizi kitaplıklarının benim için önemli olan özelliklerini gözden geçirdikten ve bir karşılaştırma tablosu derledikten sonra (yalnızca elektronik tablo: doğrudan bağlantı ). O yüzden cevap vermeye çalışacağım.
Vector.Unboxed ve UArray arasında hangi temelde seçim yapmalıyım? İkisi de kutulanmamış dizilerdir, ancak Vektör soyutlaması, özellikle döngü füzyonu etrafında yoğun bir şekilde tanıtılmış gibi görünüyor. Vector her zaman daha mı iyidir? Değilse, hangi temsili ne zaman kullanmalıyım?
İki boyutlu veya çok boyutlu dizilere ihtiyaç duyulursa UArray Vector'e tercih edilebilir. Ancak Vector, vektörleri işlemek için daha güzel API'ye sahiptir. Genel olarak, Vector çok boyutlu dizileri simüle etmek için pek uygun değildir.
Vector.Unboxed, paralel stratejilerle kullanılamaz. UArray'in de kullanılamayacağından şüpheleniyorum, ancak en azından UArray'den kutulu Array'e geçmek ve paralelleştirmenin kutu maliyetlerinden daha fazla fayda sağlayıp sağlamadığını görmek çok kolay.
Renkli görüntüler için, 16 bitlik tam sayıların üçünü veya tek duyarlıklı kayan noktalı sayıların üçünü saklamak isteyeceğim. Bu amaçla, Vector veya UArray kullanımı daha mı kolay? Daha performanslı mı?
Görüntüleri temsil etmek için Dizileri kullanmayı denedim (ancak yalnızca gri tonlamalı görüntülere ihtiyacım vardı). Renkli görüntüler için görüntüleri okumak / yazmak için Codec-Image-DevIL kitaplığını (DevIL kitaplığına bağlanmalar), gri tonlamalı görüntüler için pgm kitaplığını (saf Haskell) kullandım.
Array ile ilgili en büyük sorunum, yalnızca rastgele erişim depolaması sağlamasıydı, ancak Array algoritmaları oluşturmak için pek çok yol sağlamıyor ve dizi rutin kitaplıklarını kullanmaya hazır değil (doğrusal cebir kitaplıklarıyla arayüz oluşturmaz, Evrişimleri, fft ve diğer dönüşümleri ifade etmeye izin vermeyin).
Neredeyse var olan diziden yeni bir Dizi oluşturulması gerektiğinde, bir ara değerler listesi oluşturulmalıdır ( Nazik Giriş'teki matris çarpımı gibi ). Dizi yapımının maliyeti, bazı kullanım durumlarımda liste tabanlı temsilin daha hızlı olduğu noktaya kadar, genellikle daha hızlı rastgele erişimin avantajlarından daha ağır basar.
STUArray bana yardımcı olabilirdi, ancak şifreli tür hataları ve STUArray ile polimorfik kod yazmak için gereken çabalarla mücadele etmeyi sevmedim .
Dolayısıyla, Dizilerle ilgili sorun, sayısal hesaplamalar için uygun olmamalarıdır. Hmatrix 'Data.Packed.Vector ve Data.Packed.Matrix bu açıdan daha iyidir, çünkü katı bir matris kitaplığı (dikkat: GPL lisansı) ile birlikte gelirler. Performans açısından, matris çarpımında, hmatrix yeterince hızlıydı (Octave'den yalnızca biraz daha yavaş ), ancak hafızaya çok açdı ( Python / SciPy'den birkaç kat daha fazla tüketildi).
Matrisler için de blas kitaplığı var, ancak GHC7 üzerine inşa edilmiyor.
Henüz Repa ile fazla deneyimim olmadı ve repa kodunu iyi anlamıyorum. Gördüğüm kadarıyla çok sınırlı sayıda kullanıma hazır matris ve üzerine yazılmış dizi algoritmaları var, ancak en azından önemli algoritmaları kütüphane aracılığıyla ifade etmek mümkün. Örneğin, matris çarpımı ve repa-algoritmalarında evrişim için zaten rutinler vardır . Ne yazık ki, evrişim artık 7 × 7 çekirdekle sınırlı görünüyor (benim için yeterli değil, ancak birçok kullanım için yeterli olmalı).
Haskell OpenCV bağlamalarını denemedim. Hızlı olmalılar çünkü OpenCV gerçekten hızlı, ancak bağlamaların eksiksiz ve kullanılabilir olacak kadar iyi olup olmadığından emin değilim. Ayrıca OpenCV, doğası gereği çok zorunludur ve yıkıcı güncellemelerle doludur. Üstüne güzel ve verimli bir işlevsel arayüz tasarlamak zor sanırım. Biri OpenCV yoluna giderse, muhtemelen her yerde OpenCV resim temsilini kullanır ve bunları işlemek için OpenCV rutinlerini kullanır.
Bitonal görüntüler için piksel başına yalnızca 1 bit depolamam gerekecek. Birden çok pikseli bir kelimeye sığdırarak burada bana yardımcı olabilecek önceden tanımlanmış bir veri türü var mı yoksa tek başıma mıyım?
Bildiğim kadarıyla, Kutusuz Bools dizileri bit vektörlerini paketlemek ve paketten çıkarmakla ilgileniyor. Bools dizilerinin diğer kütüphanelerde uygulanmasına baktığımı hatırlıyorum ve bunu başka yerde görmedim.
Son olarak, dizilerim iki boyutludur. Sanırım "diziler dizisi" (veya vektörlerin vektörü) olarak bir temsilin dayattığı fazladan indirmeyle başa çıkabilirim, ancak dizin eşleme desteğine sahip bir soyutlamayı tercih ederim. Herkes standart bir kitaplıktan veya Hackage'dan herhangi bir şey önerebilir mi?
Vector (ve basit listeler) dışında, tüm diğer dizi kitaplıkları iki boyutlu dizileri veya matrisleri temsil edebilir. Sanırım gereksiz dolaylı yoldan kaçınıyorlar.