c++: Eigen Library newbie sort

橙三吉。 提交于 2019-12-23 13:04:34

问题


I can't for the life of me work out why this isn't working correctly. It doesn't seem to return the kth element.

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) ;
}

I have also tried

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) ;
}

Any help much appreciated.

Edit:-

I have just tried changing

auto d = D.row(1);

to

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

and it seems to work ok.

Slightly confused by that.


回答1:


Eigen matrices are column-major per default. That means, that a row of a matrix is not a contiguous C array and you cannot use the data pointer as an iterator.

For example, a 3x4 matrix would be stored as:

0 3 6  9
1 4 7 10
2 5 8 11

Now, row(1) would be

1 4 7 10

But the pointer iterator you are passing to nth_element() will access

1 2 3 4

Your code works if you change your matrix typedef to row-major:

typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> matrix;

Update: Your edited example works since you copy the row to a vector. For vectors (one-dimensional matrices), it does not matter if the data is stored row-major or column-major.



来源:https://stackoverflow.com/questions/10140746/c-eigen-library-newbie-sort

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!