c++ - Eigen - 排序矩阵对角线

标签 c++ sorting eigen

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

2 0 0      1 0 0
0 7 0  >>> 0 2 0
0 0 1      0 0 7

我以为我会简单地做:

std::sort(matrix.diagonal().begin(), matrix.diagonal().end());

但显然 Eigen::Diagonal 没有 begin 和 end 函数。所以问题是,是否有任何方法可以使用内部 std::sort 或任何类似优雅的方法对对角线上的元素进行排序?

我浏览了官方文档,但没有找到任何有用的东西。

最佳答案

截至目前,还没有对矩阵排序的原生支持。有两个与此功能相关的长期未决的功能请求:

正如@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

关于c++ - Eigen - 排序矩阵对角线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25341918/

相关文章:

C++ - 将 unsigned char* 复制到新的 unsigned char* 数组

c++ - 我们什么时候应该为 `std::unordered_set` 提供我们自己的哈希函数

c++ - Protocol Buffer 中缺少带有协议(protocol)的输入文件

Bash:按内容对 'find' 中的文件进行排序

java - 合并大文件的算法

c++ - 如何使用 MPI 在 Eigen::MatrixXd 中发送数据

c++ - 搜索链表是否为空

python - 对数组中的值进行排序 : 'reverse' is an invalid keyword argument for this function

c++ - 类方法子集的延迟评估

c++ - Eigen 线性代数求解器似乎很慢