2012-04-13 24 views
4

私の人生にとって、これはなぜ正しく動作しないのか分かりません。それはk番目の要素を返すようには見えません。 C++:Eigen Library初心者ソート

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

感謝すべてのヘルプ

を試してみました。

編集: -

私はちょうど

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

auto d = D.row(1); 

を変更しようとしている、正常に動作するようです。

これはちょっと混乱しています。

答えて

6

固有ベクトルはデフォルトでcolumn-majorです。つまり、行列の行は連続したC配列ではなく、データポインタをイテレータとして使用することはできません。

例えば、3×4の行列として格納されます:さて、row(1)

 
1 4 7 10 

だろう

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

しかし、あなたはnth_element()に渡しているポインタのイテレータは

 
1 2 3 4 
にアクセスします

コードを変更するとコードが機能する行優先をするのtypedef:

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

更新:編集した例では、ベクターにあなたコピー行以降で動作します。ベクトル(1次元行列)の場合、データが行メジャーまたは列メジャーに格納されているかどうかは関係ありません。