Eigen Map 没有保留提供的实际数据,看起来实际上是复制数据

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

正如我从

Eigen::Map
官方教程文档中了解到的那样,提供此实用程序是为了使用
Eigen
结构包装一些原始数据,而不复制实际的底层数据。来自教程:

有时您可能有一个预定义的想要的数字数组 在 Eigen 中用作向量或矩阵。虽然一种选择是使 数据的副本,最常见的是您可能想重复使用它 作为本征类型的记忆。幸运的是,使用地图这很容易 类。

我准备了以下非常简单的代码,其中我将

Eigen::VectorX
包裹在 4 个浮点元素的 C++ 缓冲区周围:

#include <iostream>
#include <Eigen/Dense>

int main()
{
    const int size = 4;
    float my_array[size]{ 1.0, 2.0, 3.0, 4.0 };
    printf("Original array: ");
    for (int i = 0; i < size; i++) printf("%.1f, ", my_array[i]);
    printf("\n");

    Eigen::ArrayXf eigen_array = Eigen::ArrayXf::Map(&my_array[0], 4, 1);

    printf("Eigen Array: ");
    for (int i = 0; i < size; i++) printf("%.1f, ",eigen_array(i));
    printf("\n");

    printf("Original array address: %0x\n", &my_array[0]);
    printf("Eigen array data address: %0xn\n", eigen_array.data());

    my_array[1] = 10.0;
    printf("Modified Original array at index 1 (new value = 10.0). Eigen value at index 1: %.1f\n", eigen_array(1));

    eigen_array(2) = 20.0;
    printf("Modified Eigen array at index 2 (new value = 20.0). Original array value at index 2: %.1f\n", my_array[2]);

    return 0;
}

使用 MSVC 19,Eigen 3.4.90 构建,我得到这个结果,清楚地显示了数组如何在新的 Eigen 实例中复制(注意:如果我将

ArrayXf
替换为
VectorXf
,则会发生完全相同的情况,在调试和发布模式):

Original array: 1.0, 2.0, 3.0, 4.0,
Eigen Array: 1.0, 2.0, 3.0, 4.0,
Original array address: 31cff628
Eigen array data address: b27c4df0n
Modified Original array at index 1 (new value = 10.0). Eigen value at index 1: 2.0
Modified Eigen array at index 2 (new value = 20.0). Original array value at index 2: 3.0

我错过了什么吗?我是否以某种方式误解了文档?或者这是一个错误? (我想首先认为问题是在我这边)。

c++ eigen3 raw-data
1个回答
0
投票

Eigen::ArrayXf::Map
工作正常。它不复制数组。您的代码中的问题是
Eigen::ArrayXf::Map
不返回
Eigen::ArrayXf
。它返回一些可以通过复制数组转换为
Eigen::ArrayXf
的内容。

当您使用正确的类型时,没有副本。让编译器弄清楚吧:

auto eigen_array = Eigen::ArrayXf::Map(&my_array[0], 4, 1);

现场演示

产生预期输出:

Original array: 1.0, 2.0, 3.0, 4.0, 
Eigen Array: 1.0, 2.0, 3.0, 4.0, 
Original array address: d9a99c70
Eigen array data address: d9a99c70n
Modified Original array at index 1 (new value = 10.0). Eigen value at index 1: 10.0
Modified Eigen array at index 2 (new value = 20.0). Original array value at index 2: 20.0

(杂散

n
来自您的代码,指针具有相同的值)

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