我不能为我的生活解决为什么这不正常。它似乎没有返回第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);
....
它似乎工作正常。
稍微有些困惑。
答案 0 :(得分:6)
默认情况下,特征矩阵为column-major。这意味着,矩阵的一行不是连续的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
如果您将matrix
typedef更改为row-major:
typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> matrix;
更新:您编辑的示例有效,因为您将行行复制到矢量。对于向量(一维矩阵),数据是以行主要还是列为主存储并不重要。