2016-12-14 7 views
4

この質問は、OTではないことを願っています。C++で最も効率的な行列表現は何ですか?

私は(OpenCVの、VLFeat、OpenSIFT)それらを比較するために異なる実装からVLFeat implementationSIFT記述子を使用して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_encodem.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混乱だろう。

他にも歓迎すべきことはありません。

+2

'float [9]'?列または行主要なコンベンションに同意すると、1つの列または1つの行を連続してレイアウトすることができます。 –

+0

@ AndonM.Colemanは、float [9]とfloat [3] [3]の違いについて説明しますか?それらは連続しており、列/行の規則は両方に対して変更可能です。 – UKMonkey

+0

'std :: vector v'と' v.resize(dim) '(または' v.reserve(dim) ')を使うと、行列の次元が実行時に決定されるということを忘れてしまいました。ここでは「dim = 9」となります。 – justHelloWorld

答えて

4

奇妙なことをしない限り(詳細はhereを参照)、Matのデータは連続していることが保証されています。あなたはfloat*(または他のタイプ)より軽いラッパーとしてMatを考えて、データへのアクセスを容易にすることができます。したがって、ポインタと同じくらい効率的ですが、いくつかの素晴らしい抽象概念があります。

ファイルを効率的にロード/保存する必要がある場合は、matread and matwriteを使用してMatをバイナリ形式で保存することができます。

1

std::vector<std::vector<float>> vは、メモリが連続していないため、何の努力もなく非常にうまく機能しません。

浮動小数点数[]、浮動小数点数[] []、またはstd :: array/vectorであると、メモリが連続していれば、行列をどのように反復するかによって異なります。ランダムアクセスの場合は、ほとんど違いはありません。 1つの列につきすべての列を反復処理している場合は、データを行ではなく列でグループ化する方がよいでしょう。

関連する問題