gpt4 book ai didi

c++ - 我应该如何从 Eigen 3中的张量切片中获取 vector ?

转载 作者:行者123 更新时间:2023-12-02 10:38:54 26 4
gpt4 key购买 nike

我正在努力尝试将Eigen::Tensor<double, 3>中的数据列作为Eigen::VectorXd进行访问。

slice as according to this answer可以很好地获取我想要的列。但是我不能再将其分配给 vector 。

是)我有的:

Eigen::Tensor<double, 3> my_tens(2, 3, 4);
my_tens.setRandom();

Eigen::array<Eigen::Index, 3> dims = my_tens.dimensions();

Eigen::array<Eigen::Index, 3> offsets = {0, 1, 0};
Eigen::array<Eigen::Index, 3> extents = {dims[0], 1, 1};

// This works perfectly, and is exactly the column I want:
std::cout << my_tens.slice(offsets, extents);

// ... and I want it as a VectorXd, so:
Eigen::VectorXd my_vec(dims[0]);

我尝试以下所有操作均失败:
// Direct assignment (won't compile, no viable overloaded '=')
my_vec = my_tens.slice(offsets, extents);

// Initialisation (won't compile, no viable overloaded '<<')
my_vec << my_tens.slice(offsets, extents);

// Same problem with reshaping:
g_a = signature_a.g.slice(offsets, extents).reshape(Eigen::array<Eigen::Index, 2>{dims[0], 1});

// Converting the base (won't compile, no member 'matrix')
my_vec << my_tens.slice(offsets, extents).matrix();

我也尝试了映射 as in this answer,但是也不起作用(编辑:我认为这是由于存储顺序,但实际上是由于不正确的偏移量,请参见我的回答):
// This produces a part of a row of the tensor, not a column. Gah!
auto page_offset = offsets[2] * dims[0] * dims[1];
auto col_offset = offsets[1] * dims[0];
auto bytes_offset = sizeof(double) * (page_offset + col_offset)
Eigen::Map<Eigen::VectorXd> my_mapped_vec(my_tens.data() + bytes_offset, dims[0]);

应该真的很难吗,还是我缺少简单的东西? 感谢您提供的所有帮助!

最佳答案

回答了我自己的问题:是的,我缺少一些简单的东西。通过比较我从Map操作中得到的数字,我意识到偏移量是8的因数。即通过sizeof(double)退出。

我还没有意识到my_tens.data() + bytes_offset操作需要使用my_tens.data()const double *,而不是添加固定数量的字节来偏移指针,而是将指针偏移该数量的元素。

这是正确的代码:

Eigen::Tensor<double, 3> my_tens(2, 3, 4);
my_tens.setRandom();
Eigen::array<Eigen::Index, 3> dims = my_tens.dimensions();
Eigen::array<Eigen::Index, 3> offsets = {0, 1, 0};
Eigen::array<Eigen::Index, 3> extents = {dims[0], 1, 1};

// Compute the offset, correctly this time!
auto page_offset = offsets[2] * dims[0] * dims[1];
auto col_offset = offsets[1] * dims[0];
auto elements_offset = page_offset + col_offset;

// Map into the array
Eigen::Map<Eigen::VectorXd> my_mapped_vec(my_tens.data() + elements_offset, dims[0]);

// Compare the two:
std::cout << my_tens.slice(offsets, extents) << std::endl;
std::cout << my_mapped_vec.transpose() << std::endl;

关于c++ - 我应该如何从 Eigen 3中的张量切片中获取 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54535552/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com