我不能为我的生活解决为什么这不正常.它似乎没有返回第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)
它似乎工作正常.
有点困惑.
默认情况下,特征矩阵是列主要的.这意味着,矩阵的一行不是连续的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)
更新:您编辑的示例有效,因为您将行复制到矢量.对于向量(一维矩阵),数据是存储行主要还是列主要无关紧要.