正如我从
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
我错过了什么吗?我是否以某种方式误解了文档?或者这是一个错误? (我想首先认为问题是在我这边)。
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
来自您的代码,指针具有相同的值)