เมื่อฉันตรวจสอบคุณสมบัติของไลบรารีอาร์เรย์ Haskell ที่สำคัญสำหรับฉันและรวบรวมตารางเปรียบเทียบ (เฉพาะสเปรดชีต: ลิงก์โดยตรง ) งั้นฉันจะพยายามตอบ
ฉันควรเลือกอะไรระหว่าง Vector.Unboxed กับ UArray? ทั้งคู่เป็นอาร์เรย์ที่ไม่มีกล่อง แต่นามธรรมของเวกเตอร์ดูเหมือนโฆษณาอย่างมากโดยเฉพาะอย่างยิ่งเกี่ยวกับลูปฟิวชั่น Vector ดีกว่าเสมอไปหรือไม่? ถ้าไม่ควรใช้การแทนค่าเมื่อใด
UArray อาจเป็นที่ต้องการมากกว่า Vector หากต้องการอาร์เรย์สองมิติหรือหลายมิติ แต่ Vector มี API ที่ดีกว่าสำหรับการจัดการเวกเตอร์ โดยทั่วไป Vector ไม่เหมาะอย่างยิ่งสำหรับการจำลองอาร์เรย์หลายมิติ
Vector.Unboxed ไม่สามารถใช้กับกลยุทธ์คู่ขนานได้ ฉันสงสัยว่าไม่สามารถใช้ UArray ได้ แต่อย่างน้อยมันก็ง่ายมากที่จะเปลี่ยนจาก UArray เป็น Array แบบกล่องและดูว่าการขนานกันจะมีประโยชน์มากกว่าต้นทุนการชกมวยหรือไม่
สำหรับภาพสีฉันต้องการเก็บสามเท่าของจำนวนเต็ม 16 บิตหรือสามเท่าของตัวเลขทศนิยมตำแหน่งเดียวที่มีความแม่นยำสูง เพื่อจุดประสงค์นี้ Vector หรือ UArray ใช้งานง่ายกว่ากัน? นักแสดงมากขึ้น?
ฉันลองใช้ Arrays เพื่อแสดงรูปภาพ (แม้ว่าฉันต้องการแค่ภาพสีเทา) สำหรับภาพสีฉันใช้ไลบรารี Codec-Image-DevIL เพื่ออ่าน / เขียนภาพ (การเชื่อมโยงกับไลบรารี DevIL) สำหรับภาพสีเทาฉันใช้ไลบรารี pgm (Haskell บริสุทธิ์)
ปัญหาหลักของฉันกับ Array คือมันมีที่เก็บข้อมูลการเข้าถึงแบบสุ่มเท่านั้น แต่ไม่มีวิธีการสร้างอัลกอริธึม Array มากมายและไม่ได้มาพร้อมกับไลบรารีของอาร์เรย์ที่พร้อมใช้งาน (ไม่ได้เชื่อมต่อกับไลบรารีพีชคณิตเชิงเส้น ไม่อนุญาตให้แสดงการเปลี่ยนแปลง fft และการเปลี่ยนแปลงอื่น ๆ )
เกือบทุกครั้งที่ต้องสร้าง Array ใหม่จากอาร์เรย์ที่มีอยู่จะต้องสร้างรายการค่ากลาง(เช่นเดียวกับการคูณเมทริกซ์จาก Gentle Introduction) ต้นทุนของการสร้างอาร์เรย์มักจะให้น้ำหนักกับประโยชน์ของการเข้าถึงแบบสุ่มที่เร็วขึ้นจนถึงจุดที่การแสดงตามรายการจะเร็วกว่าในบางกรณีการใช้งานของฉัน
STUArray จะได้ช่วยให้ฉัน แต่ฉันไม่ชอบการต่อสู้กับข้อผิดพลาดประเภทที่เป็นความลับและความพยายามที่จำเป็นในการเขียนรหัส polymorphic กับ STUArray
ดังนั้นปัญหาของอาร์เรย์ก็คือพวกมันไม่เหมาะสำหรับการคำนวณเชิงตัวเลข Hmatrix 'Data.Packed.Vector และ Data.Packed.Matrix ดีกว่าในแง่นี้เนื่องจากมาพร้อมกับไลบรารีเมทริกซ์ที่เป็นของแข็ง (ความสนใจ: ใบอนุญาต GPL) ประสิทธิภาพที่ชาญฉลาดในการคูณเมทริกซ์ hmatrix นั้นเร็วเพียงพอ ( ช้ากว่า Octave เพียงเล็กน้อย ) แต่มีความจำมาก (กินมากกว่า Python / SciPy หลายเท่า)
นอกจากนี้ยังมีไลบรารี blas สำหรับเมทริกซ์ แต่ไม่ได้สร้างบน GHC7
ฉันยังไม่มีประสบการณ์กับ Repa มากนักและฉันไม่เข้าใจรหัส repa ดี จากสิ่งที่ฉันเห็นมันมีช่วงที่ จำกัด มากของเมทริกซ์และอัลกอริทึมอาร์เรย์ที่เขียนไว้ด้านบน แต่อย่างน้อยก็เป็นไปได้ที่จะแสดงอัลกอริทึมที่สำคัญโดยใช้ไลบรารี ตัวอย่างเช่นมีรูทีนสำหรับการคูณเมทริกซ์และสำหรับการแปลงในอัลกอริทึม repa น่าเสียดายที่ดูเหมือนว่าตอนนี้ Convolution จะจำกัด อยู่ที่ 7 × 7 kernels (มันไม่เพียงพอสำหรับฉัน แต่ก็น่าจะเพียงพอสำหรับการใช้งานหลาย ๆ อย่าง)
ฉันไม่ได้ลองผูก Haskell OpenCV พวกเขาควรจะเร็วเพราะ OpenCV เร็วมาก แต่ฉันไม่แน่ใจว่าการเชื่อมต่อนั้นสมบูรณ์และดีพอที่จะใช้งานได้หรือไม่ นอกจากนี้ OpenCV โดยธรรมชาติแล้วนั้นมีความจำเป็นอย่างยิ่งซึ่งเต็มไปด้วยการอัปเดตที่ทำลายล้าง ฉันคิดว่ามันยากที่จะออกแบบอินเทอร์เฟซที่ใช้งานได้ดีและมีประสิทธิภาพไว้ด้านบน ถ้าใครไปทาง OpenCV เขามีแนวโน้มที่จะใช้การแสดงภาพ OpenCV ทุกที่และใช้รูทีน OpenCV เพื่อจัดการกับมัน
สำหรับภาพ bitonal ฉันจะต้องจัดเก็บเพียง 1 บิตต่อพิกเซล มีประเภทข้อมูลที่กำหนดไว้ล่วงหน้าที่สามารถช่วยฉันได้ที่นี่โดยการบรรจุพิกเซลหลาย ๆ คำลงในคำหรือฉันเป็นของตัวเอง
เท่าที่ฉันรู้อาร์เรย์ที่ไม่มีกล่องของ Boolsจะดูแลการบรรจุและการแกะเวกเตอร์บิต ฉันจำได้ว่าดูการใช้งานอาร์เรย์ของ Bools ในไลบรารีอื่น ๆ และไม่เห็นสิ่งนี้ที่อื่น
สุดท้ายอาร์เรย์ของฉันเป็นสองมิติ ฉันคิดว่าฉันสามารถจัดการกับอินดิเคเตอร์พิเศษที่กำหนดโดยการแทนค่าเป็น "อาร์เรย์อาร์เรย์" (หรือเวกเตอร์ของเวกเตอร์) แต่ฉันต้องการสิ่งที่เป็นนามธรรมที่รองรับการทำแผนที่ดัชนี มีใครแนะนำอะไรจากไลบรารีมาตรฐานหรือจาก Hackage ได้บ้าง?
นอกเหนือจากเวกเตอร์ (และรายการแบบง่าย) แล้วไลบรารีอาร์เรย์อื่น ๆ ทั้งหมดยังสามารถแทนอาร์เรย์หรือเมทริกซ์สองมิติได้ ฉันคิดว่าพวกเขาหลีกเลี่ยงความไม่แน่นอน