gpt4 book ai didi

c++ - 将 Eigen::Map 与结构数组一起使用

转载 作者:行者123 更新时间:2023-11-27 23:36:19 25 4
gpt4 key购买 nike

给定一个结构数组,我如何使用 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 之前确保 &foos[0].b 不为空)

这恰好有效,因为 double (通常)对齐 8 个字节,即 Foob 之前会有填充字节在 c 之后这样sizeof(Foo)保证是 sizeof(double) 的倍数.如果您想确定,请添加静态断言。

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

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

关于c++ - 将 Eigen::Map 与结构数组一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58979653/

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