特征 - 排序矩阵对角线

Jen*_*das 7 c++ sorting eigen

我所拥有的是对角矩阵类型Eigen::MatrixXi.我需要对角线上的元素按升序排序.例如这样:

2 0 0      1 0 0
0 7 0  >>> 0 2 0
0 0 1      0 0 7
Run Code Online (Sandbox Code Playgroud)

我以为我会这样做:

std::sort(matrix.diagonal().begin(), matrix.diagonal().end());
Run Code Online (Sandbox Code Playgroud)

但显然Eigen::Diagonal没有开始或结束功能.所以问题是,是否有任何方法使用内部std :: sort或任何类似优雅的东西在对角线上排序元素?

我浏览了官方文档,但没有找到任何有用的信息.

cht*_*htz 1

截至目前,尚无对矩阵排序的原生支持。有两个与此功能相关的长期待处理的功能请求:

正如 @NicolasM 在评论中所建议的,目前,最优雅的解决方案是自己提供自定义迭代器,例如:

namespace Eigen {
  template<typename Scalar>
  class iterator {
    Scalar* ptr;
    int stride;
  public: 
    iterator(Scalar* ptr_, int stride_) : ptr(ptr_), stride(stride_) {}
    Scalar& operator*() const { return *ptr;}
    iterator& operator++() { ptr += stride; return *this;}
    bool operator<(const iterator& other) { return ptr < other.ptr; }
    // implement further operations, required for random access iterators ...
  }

  template<class Derived>
  iterator begin(MatrixBase<Derived>&& mat)
  { return iterator(mat.data(), mat.innerStride()); }
  template<class Derivde>
  iterator end(MatrixBase<Derived>&& mat)
  { return iterator(mat.data() + mat.size()*mat.innerStride(), mat.innerStride()); }

} // namespace Eigen
Run Code Online (Sandbox Code Playgroud)