2012-04-13 101 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) ; 
} 

任何帮助非常赞赏。

编辑: -

我刚才试图改变

auto d = D.row(1); 

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

,它似乎工作确定。

有点困惑。

回答

6

默认情况下,特征矩阵是column-major。这意味着,一行矩阵不是连续的C数组,并且不能将数据指针用作迭代器。

例如,3×4矩阵将被存储为:

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

现在,row(1)

 
1 4 7 10 

但是要传递到nth_element()指针迭代器访问

 
1 2 3 4 

如果您更改,您的代码有效的typedef行主:

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

更新:编辑过的示例工作,因为你复制该行的向量。对于矢量(一维矩阵),数据是存储在行 - 主还是列 - 主要的并不重要。