C++ 获取DenseBase的非常量引用并将其填充到函数中是行不通的

C++ 获取DenseBase的非常量引用并将其填充到函数中是行不通的,c++,eigen,C++,Eigen,我正在写一个函数来对密集矩阵或数组进行特征排序,并返回排列的索引。功能如下: template<typename Derived1, typename Derived2> typename Derived1::PlainObject sort(const DenseBase<Derived1> &x, DenseBase<Derived2> &indices) { typename Derived1::PlainObject y = x

我正在写一个函数来对密集矩阵或数组进行特征排序,并返回排列的索引。功能如下:

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;
}
x的排序正确,但我希望索引矩阵/数组保存排序过程的索引,但它是空的:|

这里发生了什么?在第一个函数z中,作为基本派生类型的索引被正确分配和填充,为什么函数结束后索引为空

非常感谢。

您需要z作为index.derived的引用,而不是副本:

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

确保派生也返回一个引用。

我在函数中没有看到任何修改索引的代码,那么为什么您认为索引应该已经更改?我认为在派生索引上调用派生索引将返回一个引用,实际上它会直接修改基础索引的对象。但我将派生的输出存储为副本,而不是引用。
typename Derived2::PlainObject & z = indices.derived();