我拥有的是 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 或任何类似优雅的方法对对角线上的元素进行排序?
我浏览了官方文档,但没有找到任何有用的东西。
最佳答案
截至目前,还没有对矩阵排序的原生支持。有两个与此功能相关的长期未决的功能请求:
- Bug 231 - STL compatible iterators
- Bug 299 - Sort function for matrices and vectors returning indices as well
正如@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/