将 Eigen::Map 与结构数组一起使用
Using Eigen::Map with array of structs
给定一个结构数组,我如何使用 Eigen 来计算所有 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
Eigen 中的步幅始终被视为 Scalar 大小的倍数,即您需要编写:
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 个字节,即 Foo
将在 b
之前和 c
之后有填充字节所以 sizeof(Foo)
保证是 sizeof(double)
的倍数。如果您想确定,请添加静态断言。
使用演示:https://godbolt.org/z/aM-veN
警告:这对 std::complex<double>
不起作用,除非您以某种方式确保结构的大小是 16 的倍数(或 std::complex<float>
的 8 的倍数)
给定一个结构数组,我如何使用 Eigen 来计算所有 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
Eigen 中的步幅始终被视为 Scalar 大小的倍数,即您需要编写:
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 个字节,即 Foo
将在 b
之前和 c
之后有填充字节所以 sizeof(Foo)
保证是 sizeof(double)
的倍数。如果您想确定,请添加静态断言。
使用演示:https://godbolt.org/z/aM-veN
警告:这对 std::complex<double>
不起作用,除非您以某种方式确保结构的大小是 16 的倍数(或 std::complex<float>
的 8 的倍数)