C++:Eigen库新手排序

4

我真的想不出为什么这个没有正确地工作。它似乎没有返回第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);

to

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

看起来它运行良好。

有点困惑。

1个回答

6
Eigen矩阵默认为列主序。这意味着,矩阵的一行不是一个连续的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更改为行主序,则代码将正常工作:
typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> matrix;

更新:你修改后的示例可行,因为你将行复制到了一个向量中。对于向量(一维矩阵),数据是按行存储还是按列存储都无所谓。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接