現在のプロジェクトでは、いくつかのことにスパースベクトルを使用する必要があります。ただ、私はプロジェクトを担当していないので、外部の図書館は使えません。STLとOpenCVしか利用できません。
私はいくつかのstackoverflowの回答済みの質問を調べましたが、それらは特定のアプローチ、限られた数のアプローチの比較(2)、およびスパースベクトルを具体的に扱う場合の外部ライブラリのいずれかに焦点を当てています。スパース行列を実装するための優れたアイデアもいくつかあります。
私が欲しいのは、具体的にはスパースベクトルです(インデックスは常に1次元になり、データはこの質問には関係ありません)。それ自体ではプロジェクトではないものを実装したいのですが、デモンストレーション以上の目的(たとえば、まともな速度を達成し、メモリのオーバーヘッドをあまり多くしたくない)に使用でき、うまくいけば再実行できます。後で使用します。私が検討したオプションは次のとおりです。
- SparseMatのOpenCV実装を私のニーズに適合させる
- を使用し
std::map
て値を格納します(または、ゼロ要素にインデックスを付ける場合にデフォルト値を返す非常に単純なラッパーを作成します) - 要素
std::vector< std::pair < int , data_type > >
にインデックスとデータを格納できる場所を使用するstd::pair
これらのソリューションのいずれかが、スパースベクトルとしての汎用使用に適していますか?私はすべてへのすべてのアプローチに浮き沈みがあることを知っていますが、どのアプローチを選択するかについての議論された提案は非常にありがたいです。また、私が考えていないアプローチを推奨することは、誰かが彼がより良い提案をしていると思うなら、大歓迎です。
私の特定の場合の使用法は次のとおりです。
- ベクトルは、作成後に変更されない可能性があります(現時点では、これは必要ありませんが、100%表示されないことを保証することはできません)
- 最も一般的な操作は、そのような2つのベクトルの内積であると予想されます(つまり、多かれ少なかれ線形の順次方法で要素にアクセスします)
- 私が今予測できる唯一のルックアップは、(多分)特定の要素がゼロ要素であるかどうかを天気をチェックすることです
- 約500の非ゼロ要素が予想されます
- つまり、ほとんどの場合、スパースベクトルは、各座標を個別に調べる必要なしに、ベクトル(多次元ポイント)の数学的概念として使用されます。
それでも、元の質問で書いたように、汎用のスパースベクトルの実装について提案したいと思います。