gpt4 book ai didi

c++ - 存储指向 Eigen Vector 'segment' 的指针而不复制?

转载 作者:太空狗 更新时间:2023-10-29 20:37:36 27 4
gpt4 key购买 nike

我有一个特征向量,我想在以后引用一个(例如,在函数之间传递)而不是立即修改。

Eigen::Matrix<float, Eigen::Dynamic, 1> vec(10);

// initialize
vec << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;

我想创建一个指向 的指针,我以后可以引用它。以下工作正常,但它会创建一个拷贝,因此对 segment 所做的任何更改都不会反射(reflect)在原始 vector 中。

const int start = 2;
const int end = 8

Eigen::Matrix<float, Eigen::Dynamic, 1> *block = new Eigen::Matrix<float, Eigen::Dynamic, 1>(end - start + 1, 1);
*block = vec.segment(start-1,end-1);

如何在不复制的情况下保留对的引用?

最佳答案

您可以使用 Eigen::Map在不复制的情况下包装现有的内存段。我不确定您为什么分配 *block 对象而不只是使用 block。使用 Map 看起来像

Eigen::Map<Eigen::VectorXf> block(&vec(start - 1), end - start + 1);

然后您可以像使用普通 VectorXd 一样使用 Map,无需调整大小和其他内容。更简单(至少根据 @ggael ),您可以使用 Eigen:Ref在不引入拷贝的情况下引用 Eigen 对象的一部分。例如:

void times2(Eigen::Ref< Eigen::VectorXf> rf)
{
rf *= 2.f;
}
int main()
{

Eigen::Matrix<float, Eigen::Dynamic, 1> vec(10);

// initialize
vec << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;

const int start = 2;
const int end = 8;

// This would work as well
//Eigen::Map<Eigen::VectorXf> block(&vec(start - 1), end - start + 1);

Eigen::Ref<Eigen::VectorXf> block = vec.segment(start, end - start + 1);

std::cout << block << "\n\n";

times2(block);

std::cout << vec << "\n";
return 0;
}

附言我认为您滥用了 segment 函数。它需要一个起始位置和元素数量,即 (start, end-start+1)

关于c++ - 存储指向 Eigen Vector 'segment' 的指针而不复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34299447/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com