4

なぜこれが正しく機能しないのか、一生わかりません。k番目の要素を返していないようです。

typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> matrix;

double test(matrix& D, int k)
{
    auto d = D.row(1);
    std::nth_element(d.data(),d.data()+k, d.data()+d.size());
    return d(k) ;
}

私も試してみました

template <typename ScalarType, typename Derived>
void Sort(Eigen::MatrixBase<Derived> &xValues)
{
std::sort(xValues.derived().data(), xValues.derived().data()+xValues.derived().size());
}


double test(matrix& D, int k)
{
    auto d = D.row(1);
    Sort<double>(d);
    return d(k) ;
}

どんな助けでも大歓迎です。

編集:-

さっそく変えてみました

auto d = D.row(1);

Eigen::VectorXd rowD = D.row(1);
....

そしてそれはうまくいくようです。

それに少し混乱。

4

1 に答える 1

6

デフォルトでは、固有行列は優先です。つまり、行列の行は連続した C 配列ではなく、データ ポインターを反復子として使用することはできません。

たとえば、3x4 行列は次のように格納されます。

0 3 6 9
1 4 7 10
2 5 8 11

さてrow(1)

1 4 7 10

しかし、あなたが渡しているポインタイテレータnth_element()はアクセスします

1 2 3 4

matrixtypedef を行優先に変更すると、コードが機能します。

typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> matrix;

更新:行をベクターにコピーするため、編集した例が機能します。ベクトル (1 次元行列) の場合、データが行優先または列優先で格納されているかどうかは問題ではありません。

于 2012-04-13T12:29:02.900 に答える