使用带有结构数组的 Eigen::Map



给定一个结构数组,例如,如何使用特征计算所有Foo.b的平均值?

struct Foo {
        int a;
        double b;
        char c;
}
std::vector<Foo> foos;
// push_back some Foos

从文档中,我认为我应该能够使用 Eigen::Map 并适当地设置步幅来做到这一点,我似乎无法确切地弄清楚它需要是什么。我认为它应该是这样的:

using namespace Eigen;
double* bPtr = foos.data() + offsetof(struct Foo, b); // casts omitted for brevity
Map<ArrayXd, Unaligned, InnerStride<sizeof(Foo)>> bMap(bPtr, foos.size());
double mean = bMap.mean();

相关文档在这里: https://eigen.tuxfamily.org/dox/classEigen_1_1Map.html

特征中的步幅始终被视为标量大小的倍数,即您需要编写:

using namespace Eigen;
Map<ArrayXd, Unaligned, InnerStride<sizeof(Foo)/sizeof(double)> >
   bMap(&foos[0].b, foos.size());
double mean = bMap.mean();

(在执行&foos[0].b之前,请确保foos不为空(

这恰好有效,因为double(通常(的对齐方式为 8 个字节,即Foob之前和之后c都有填充字节,因此sizeof(Foo)保证是 sizeof(double) 的倍数。如果要确定,请添加静态断言。

使用演示:https://godbolt.org/z/aM-veN

警告:这不适用于std::complex<double>,除非您以某种方式确保结构的大小是 16 的倍数(或 8 的倍数表示std::complex<float>(

相关内容

  • 没有找到相关文章

最新更新