获取 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 也是参考。
我正在编写一个函数来对 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 也是参考。