将指针存储到Eigen Vector'segment'而不复制?

时间:2015-12-15 21:10:29

标签: c++ eigen

我有一个特征向量,我想稍后引用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的引用?

1 个答案:

答案 0 :(得分:5)

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

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

然后使用Map,就像使用普通VectorXd一样,没有调整大小和内容。更简单(至少根据@ggael),您可以使用Eigen:Ref来引用特征对象的一部分而不会导致副本。例如:

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)