c++:特征库新手排序

c++: Eigen Library newbie sort

本文关键字:新手 排序 特征 c++      更新时间:2023-10-16

我一辈子都无法弄清楚为什么这不能正常工作。它似乎没有返回第 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);
....

而且似乎工作正常。

对此有点困惑。

默认情况下,

特征矩阵是列主矩阵。 这意味着,矩阵的一行不是连续的 C 数组,您不能将数据指针用作迭代器。

例如,3x4 矩阵将存储为:

0 3 6  91 4 7 102 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;

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