自分にとって重要なHaskell配列ライブラリの機能を確認し、比較表を作成しました(スプレッドシートのみ:直接リンク)。だから答えようと思います。
Vector.UnboxedとUArrayのどちらを選択する必要がありますか?どちらもボックス化されていない配列ですが、ベクターの抽象化は、特にループフュージョンを中心に宣伝されているようです。ベクターは常に優れていますか?そうでない場合、いつどの表現を使用すればよいですか?
2次元または多次元配列が必要な場合は、UArrayがVectorよりも優先される場合があります。しかし、Vectorには、ベクターを操作するためのより優れたAPIがあります。一般に、Vectorは多次元配列のシミュレーションにはあまり適していません。
Vector.Unboxedは、並列戦略では使用できません。UArrayもどちらも使用できないと思いますが、少なくともUArrayからボックス化配列に切り替えて、並列化の利点がボクシングコストを上回るかどうかを確認するのは非常に簡単です。
カラー画像の場合、16ビット整数のトリプルまたは単精度浮動小数点数のトリプルを格納したいと思います。この目的のために、VectorまたはUArrayを使用する方が簡単ですか?より高性能ですか?
配列を使用して画像を表現しようとしました(ただし、グレースケール画像のみが必要でした)。カラー画像の場合、Codec-Image-DevILライブラリを使用して画像(DevILライブラリへのバインディング)を読み書きし、グレースケール画像の場合、pgmライブラリ(純粋なHaskell)を使用しました。
配列に関する私の主な問題は、ランダムアクセスストレージしか提供しないことですが、配列アルゴリズムを構築する多くの手段を提供せず、配列ルーチンのライブラリをすぐに使用できるようになりません(線形代数ライブラリーとのインターフェースはありません、畳み込み、FFT、その他の変換を表現することはできません)。
ほとんどの場合、既存の配列から新しい配列を作成する必要があるたびに、値の中間リストを作成する必要があります(行列乗算など) Gentle Introductionの)。多くの場合、配列の構築コストは、ランダムアクセスが高速であることの利点を上回っており、リストベースの表現の方が私のユースケースの一部で高速であるという点にまで達しています。
STUArrayは私を助けることができたかもしれませんが、私はSTUArrayでポリモーフィックなコードを書くために必要な暗号タイプのエラーや努力と戦うのが好きではありませんでした。
したがって、配列の問題は、配列が数値計算にあまり適していないことです。HmatrixのData.Packed.VectorとData.Packed.Matrixは、固体マトリックスライブラリ(注意:GPLライセンス)が付属しているため、この点で優れています。パフォーマンスの観点から、行列の乗算では、hmatrixは十分に高速でしたが(Octaveよりわずかに遅い)、非常にメモリを消費しました(Python / SciPyの数倍以上消費されました)。
マトリックス用のblasライブラリもありますが、GHC7に基づいて構築されていません。
私はまだRepaの経験があまりなく、repaコードをよく理解していません。私が見るところから見ると、その上に書かれたすぐに使用できる行列および配列アルゴリズムの範囲は非常に限られていますが、少なくともライブラリを使用して重要なアルゴリズムを表現することは可能です。たとえば、行列の乗算と反復アルゴリズムの畳み込みのルーチンは既に存在します。残念ながら、畳み込みは現在7×7カーネルに制限されているようです(私には十分ではありませんが、多くの用途には十分です)。
Haskell OpenCVバインディングは試していません。OpenCVは本当に高速であるため、高速である必要がありますが、バインディングが完全であり、使用できるほど十分であるかどうかはわかりません。また、OpenCVはその性質上、破壊的な更新に満ちた非常に不可欠です。その上に素敵で効率的な機能的インターフェースを設計するのは難しいと思います。OpenCVの方法を採用する場合、彼はどこでもOpenCV画像表現を使用し、OpenCVルーチンを使用してそれらを操作する可能性があります。
モノクロイメージの場合、ピクセルごとに1ビットのみを保存する必要があります。複数のピクセルを1つの単語にパックすることによってここで私を助けることができる事前定義されたデータ型はありますか、それとも私一人でですか?
私の知る限り、Boolのボックス化されていない配列は、ビットベクトルのパックとアンパックを処理します。他のライブラリでのBoolsの配列の実装を見た覚えがありますが、他の場所では見られませんでした。
最後に、私の配列は2次元です。「配列の配列」(またはベクトルのベクトル)としての表現によって課される追加の間接参照を処理できると思いますが、インデックスマッピングをサポートする抽象化を好みます。誰でも標準ライブラリやHackageから何かを推薦できますか?
ベクトル(および単純なリスト)を除いて、他のすべての配列ライブラリは2次元配列または行列を表すことができます。彼らは不必要な間接参照を避けていると思います。