この質問は、OTではないことを願っています。C++で最も効率的な行列表現は何ですか?
私は(OpenCVの、VLFeat、OpenSIFT)それらを比較するために異なる実装からVLFeat implementationとSIFT記述子を使用してVLADエンコーダを実装しています。
これはC++の高性能アプリケーションであると考えられています(私はSIFTが非常に非効率であることを知っています、私はそれをパラレルバージョンとして実装しています)。
ここで、VLADは連続した記述子(数学ベクトル)のセットへのポインタを入力として求めます。ポイントは、通常、このSIFT記述子は行列として表現されるため、それらを管理する方が簡単です。
だから我々は(私は実際には128次元で記述子の何千ものですが、簡単のためにこれらの番号を使用しています)3次元で3つのディスクリプタのマトリックスを持っていると仮定:
1 2 3
4 5 6
7 8 9
私がする必要がありますcv::Mat m
オブジェクトに
1 2 3 4 5 6 7 8 9
単純溶液が保存されている記述子とその後vl_vlad_encode
にm.data
を渡す:へのポインタとvl_vlad_encode
を養います。
しかし、cv::Mat
が効率的なマトリックス表現であるかどうかわかりません。たとえば、Eigen::Matrix
は代替です(このオブジェクトを使用して上記の表現を取得するのは簡単だと思います)。しかし、どの実装がより高速で効率的か、他の理由があるかどうかわかりません。その他。
別の可能な選択肢は、std::vector<std::vector<float>> v
を使用していますが、v.data()
を使用して、私が代わりに上記の表現を取得するかどうかはわからない: 1 2 3 *something* 4 5 6 *something* 7 8 9
明らか*something*
アップvl_vlad_encode
混乱だろう。
他にも歓迎すべきことはありません。
'float [9]'?列または行主要なコンベンションに同意すると、1つの列または1つの行を連続してレイアウトすることができます。 –
@ AndonM.Colemanは、float [9]とfloat [3] [3]の違いについて説明しますか?それらは連続しており、列/行の規則は両方に対して変更可能です。 – UKMonkey
'std :: vector v'と' v.resize(dim) '(または' v.reserve(dim) ')を使うと、行列の次元が実行時に決定されるということを忘れてしまいました。ここでは「dim = 9」となります。 –
justHelloWorld