c ++:Eigen Library新手排序

ora*_*001 4 c++ sorting eigen

我不能为我的生活解决为什么这不正常.它似乎没有返回第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) ;
}
Run Code Online (Sandbox Code Playgroud)

我也试过了

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) ;
}
Run Code Online (Sandbox Code Playgroud)

任何帮助非常感谢.

编辑:-

我刚试过改变

auto d = D.row(1);
Run Code Online (Sandbox Code Playgroud)

Eigen::VectorXd rowD = D.row(1);
....
Run Code Online (Sandbox Code Playgroud)

它似乎工作正常.

有点困惑.

Fer*_*yer 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 更改为row-major,则代码可以正常工作:

typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> matrix;
Run Code Online (Sandbox Code Playgroud)

更新:您编辑的示例有效,因为您复制到矢量.对于向量(一维矩阵),数据是存储行主要还是列主要无关紧要.