7

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

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);
}

}

Matrix_基本型を flann からサブクラス化して、Eigen3 行列へのアダプターを作成するオプションを調査しました。ただし、問題は、インターフェイスでのオペレーターMatrix_の実装に依存していることです。[]上記の単純な (しかし壊れた) ソリューションと同じメモリの問題が発生する可能性があるように感じます。

そのような行動を説明できるものは何だと思いますか?

  • 行/列優先の問題
  • 内外歩の問題
  • メモリ アラインメントの非互換性
  • Eigen::Map甘いですが、私が探しているものではありません。コードを書き直してstl::vector<std::vector<double> >基本型として使用Eigen::Mapするのは面倒です。Eigen::MatrixXd
  • http://nanoflann-reference.mrpt.org/svn/structnanoflann_1_1KDTreeEigenMatrixAdaptor.html残念ながら、ベースの libflann ライブラリから遠すぎて使用できません。
4

2 に答える 2

7

また、libflann の作成者である Marius Muja から確認を得ました。これは、Eigen がflann::Matrixデフォルトで列優先を使用するのに対し、行優先で格納されます。彼がメールで私にくれた答えは次のとおりです。

問題は、Eigen が行列を列優先の順序で格納するのに対し、FLANN は行優先の順序で行列を必要とするという事実である可能性が最も高いです。

Matrix<double, Dynamic, Dynamic, RowMajor>解決策はの代わりにを使用MatrixXdすることです。そうすれば、FLANN 行列と Eigen 行列は同じメモリを共有できます。そうしないと、コピーが必要になります。マリウス・ムジャ

于 2012-11-26T19:33:34.807 に答える
1

Eigen::Matrix は継続的にデータを保存するため、ストライドの問題は発生しません。その上に Eigen::Matrix を構築しようとしている場合、アライメントが問題になる可能性があります (しかし、これがどのように可能になるか想像できません)。デフォルトでは Eigen::Matrix は列優先ですが、これが問題かもしれません。フランが行列をどのように扱うかわかりません。行列が行優先であれば、それだけです。次の例は Eigen::Matrix< double, -1, -1, Eigen::RowMajor > for mat で動作し、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);
}

Eigen::Map についての苦情はありません。これは、一部のデータを固有行列 (デフォルトでは依然として列優先であることに注意してください) として扱うのに最適な方法であり、行列からサブクラス化するか、カスタム固有式を実装するのは面倒な場合があります。

于 2012-11-22T13:48:19.860 に答える