2012-11-20 26 views
7

以下のmatEigen::MatrixXdであり、すでにいくつかのデータが含まれているとします。メモリの重複を避けるための試みで、私はEigen3によって割り当てられた生のメモリチャンクへのポインタからflann::Matrix<double>オブジェクトをインスタンス化しようとした:Eigen :: MatrixXd to flann :: Matrix <double>変換

flann::Matrix<double> input(const_cast<double *>(mat.data(), mat.rows(), mat.cols()) 

しかし、私のアルゴリズムは、ゴミを出力しますが、醜いとだけで結構です。

flann::Matrix<double> input(new double[mat.rows()*mat.cols()], mat.rows(), mat.cols()); 
for (int i = 0; i < mat.rows(); i++) { 
for (int j = 0; j < mat.cols(); j++) { 
    input[i][j] = mat(i, j); 
} 

}

私はEigen3行列にアダプタを作成するためにFLANNからベースMatrix_タイプをサブクラス化するためのオプションを検討しました。しかし、問題は、Matrix_が、そのインタラクションで[]オペレータの実装に依存していることです。上記の単純な(しかし壊れた)ソリューションと同じメモリ問題が発生する可能性があります。

このような現象を説明できると思いますか?

  • 行/列-大きな問題
  • インナー、アウターストライド問題が
  • メモリアライメントが
  • Eigen::Mapを非互換性私が探して甘いですが、ありません。これは、残念ながらあまりにも遠くベースlibflannライブラリから使用できるようにEigen::MatrixXd
  • http://nanoflann-reference.mrpt.org/svn/structnanoflann_1_1KDTreeEigenMatrixAdaptor.htmlにそれらを基本型としてstl::vector<std::vector<double> >を使用するために再書き込み私のコードに吸うとEigen::Mapでしょう。

答えて

0

Eigen :: Matrixはデータを連続して保存するので、ストライドの問題は発生しません。 Eigen :: Matrixを構築しようとすると、アライメントが問題になる可能性があります(ただし、これがどのように可能かは想像できません)。デフォルトでは、Eigen :: Matrixは列メジャーですが、これはあなたの問題かもしれません。フラットが行列をどのように扱うのか分かりません。次の例では、Eigen :: Matrix < double、-1、-1、Eigen :: RowMajor>をマッチに使用し、Eigen :: MatrixXdで失敗します。

int k = 0; 
for (int i = 0; i<mat.rows(); ++i) 
{ 
    for (int j = 0; j<mat.cols(); ++j, ++k) { 
     mat(i, j) = k; 
    } 
} 

double* mptr = mat.data(); 
for (int i = 0; i<mat.rows() * mat.cols(); ++i) { 
    assert(mptr[i] == i); 
} 

私はあなたの固有::地図文句を持っていません。いくつかのデータを固有行列として処理するのが一番良い方法です(既定ではまだ列長になることに注意してください)。行列からサブクラス化するか、カスタム固有表現を実装するのは苦しいかもしれません。

7

libflannの著者Marius Mujaもflann::Matrixは行優先順位で格納していますが、Eigenはデフォルトでcolumn-majorを使用しています。ここで彼は電子メールで私に与えた答えがあります:

問題が最も可能性が高いという事実である列優先順に固有の店舗行列> FLANNは行優先順でそれらを必要とします。

MatrixXdの代わりにMatrix<double, Dynamic, Dynamic, RowMajor>を使用すると、FLANNとEigenの行列は同じメモリを共有できます。そうでない場合はコピーが必要になります。 Marius Muja

+0

私はnanoFLANNと同じ問題を抱えていましたが(どちらの方法でも動作しましたが、デフォルトのColumn-Majorは私のアプリケーションでは非常に不器用でした)、ありがとう! –

関連する問題