在 Eigen 中,对于预分配的矩阵,赋值运算符是否会尝试重用现有内存?

问题描述 投票:0回答:1

考虑以下特征代码片段:

  • 选项1
    Eigen::MatrixXf A (m, n), B;
    B = A;
    
  • 选项2
    Eigen::MatrixXf A (m, n), B (m, n);
    B = A;
    

在选项 1 中,我假设

B
开始时具有大小
(0, 0)
,然后动态分配以具有与
A
匹配的大小,然后
A
的元素被复制到
B
中。我的问题是:

  1. 在选项 2 中,由于
    B
    已经动态分配了与
    A
    相匹配的大小,Eigen 是否能够将
    A
    的元素复制到
    B
    的元素?或者它是否按照
    delete
    后跟适当大小的
    malloc
    /
    new
    的方式执行某些操作,丢弃预先分配的内存?
  2. 如果后者为真(即,
    B
    无论如何都会被删除并重新分配),那么如果我知道
    A,那么将
    B
    的元素复制到
    B
    同时避免内存重新分配的有效/优雅的方法是什么? 
    已经有正确的尺寸了吗?我可以在
    m
    n
    上编写循环并进行手动复制,但我想知道是否有可以利用矢量化的内置方法。我能找到的唯一方法是获取
    A
    的底层数据指针,然后使用
    Eigen::Map
    ,但我认为这实际上并没有复制数据 - 它只是将
    B
    指向内存与
    A
    相关的块。此外,根据
    docs
    .noalias() 似乎在这里没有效果,因为它仅适用于矩阵乘法。我想知道是否有更好的方法。

谢谢!

matrix c++17 deep-copy eigen3
1个回答
0
投票

我想

Eigen::MatrixXf A (m, n), B (m, n);
B.block(0, 0, m, n) = A;

是一种方法,但我不确定这是最干净的方法。

© www.soinside.com 2019 - 2024. All rights reserved.