使用Eigen :: Map和结构数组

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

给定一个结构数组,如何使用本征来例如计算所有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

c++ eigen eigen3
1个回答
0
投票

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

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

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

这正好起作用,因为double(通常)具有8个字节的对齐方式,即Foob之前和c之后将具有填充字节,因此可以确保sizeof(Foo)为整数sizeof(double)。如果需要确定的话,添加一个静态断言。

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

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