获取 DenseBase<Derived> 的非常量引用并将其填充到函数中不起作用

Taking a non-const reference of DenseBase<Derived> and fill it inside a function does not work

我正在编写一个函数来对 Eigen 中的密集矩阵或数组以及排列的索引 return 进行排序。函数如下:

template<typename Derived1, typename Derived2>
typename Derived1::PlainObject sort(const DenseBase<Derived1> &x, DenseBase<Derived2> &indices)
{
    typename Derived1::PlainObject y = x.derived();
    typename Derived2::PlainObject z = indices.derived();

    z.resize(y.rows(), y.cols());
    for (int i = 0; i < z.size(); ++i)
        z(i) = i;

    std::sort(z.data(), z.data() + z.size(), [&](size_t a, size_t b) { return y(a) < y(b); });

    for (int i = 0; i < z.size(); ++i)
        y(i) = x((int) z(i));

    return y;
}

现在我想通过以下方式在一段代码中调用这个函数:

const ArrayXXd x = ArrayXXd::Random(5, 5);
ArrayXXi indices;
const ArrayXXd xsort = sort(x, indices);

x 排序正确,但我希望 indices matrix/array 保存排序过程的索引,但它是空的:|

这里发生了什么?在第一个函数z(是indices的底层派生类型)被正确分配和填充,为什么函数结束后indices是空的?

非常感谢。

您需要 z 作为对 indices.derived() 的引用,而不是副本:

typename Derived2::PlainObject & z = indices.derived();

确保 derived() returns 也是参考。