当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《将指针存储到EigenVector'segment'而不复制?》经验,为你挑选了1个好方法。

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

Eigen::Matrix 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 *block = new Eigen::Matrix(end - start + 1, 1);
*block = vec.segment(start-1,end-1);

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



1> Avi Ginsburg..:

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

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

然后Map你就像正常情况一样使用VectorXd,没有调整大小和东西.更简单(至少根据@ggael),您可以使用a Eigen:Ref来引用Eigen对象的一部分而不会引入副本.例如:

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

    Eigen::Matrix 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 block(&vec(start - 1), end - start + 1);

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

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

    times2(block);

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

PS我认为你误用了这个segment功能.它取一个起始位置的元素数量,即(start, end-start+1).

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有