存储指向特征向量 'segment' 的指针而不复制?
Store pointer to Eigen Vector 'segment' without copy?
我有一个特征向量,我想稍后引用 segment
(例如,在函数之间传递)而不是立即修改。
Eigen::Matrix<float, Eigen::Dynamic, 1> vec(10);
// initialize
vec << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;
我想创建一个指向 segment
的指针,我以后可以引用它。以下有效,但它创建了一个副本,因此对 segment
所做的任何更改都不会反映在原始向量中。
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);
如何在不复制的情况下保留对 segment
的引用?
您可以使用 Eigen::Map
来包装现有的内存段而无需复制。我不确定您为什么要分配 *block
对象而不只是使用 block
。使用 Map
它看起来像
Eigen::Map<Eigen::VectorXf> block(&vec(start - 1), end - start + 1);
然后您可以像使用普通 VectorXd
一样使用 Map
,无需调整大小等。更简单(至少根据 ), you can use an 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;
}
P.S。我认为您滥用了 segment
函数。它以元素的数量作为起始位置,即 (start, end-start+1)
.
我有一个特征向量,我想稍后引用 segment
(例如,在函数之间传递)而不是立即修改。
Eigen::Matrix<float, Eigen::Dynamic, 1> vec(10);
// initialize
vec << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;
我想创建一个指向 segment
的指针,我以后可以引用它。以下有效,但它创建了一个副本,因此对 segment
所做的任何更改都不会反映在原始向量中。
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);
如何在不复制的情况下保留对 segment
的引用?
您可以使用 Eigen::Map
来包装现有的内存段而无需复制。我不确定您为什么要分配 *block
对象而不只是使用 block
。使用 Map
它看起来像
Eigen::Map<Eigen::VectorXf> block(&vec(start - 1), end - start + 1);
然后您可以像使用普通 VectorXd
一样使用 Map
,无需调整大小等。更简单(至少根据 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;
}
P.S。我认为您滥用了 segment
函数。它以元素的数量作为起始位置,即 (start, end-start+1)
.