如何对类的特征向量的属性求和

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

我已经声明了我创建的类的向量,如下所示:

typedef Eigen::Vector<Trade, Dynamic> VectorT;

我正在尝试对滚动的交易窗口求和。金额

在从

std::vector
切换到
Eigen::Vector
之前,我做了这个

for (size_t i = 30; i < trades.size(); ++i) {
    double cum_buy_qty = 0;
    for (size_t k = i - 30; k <= i; ++k) {
        cum_buy_qty += trades[k].buyQuantity;
}}

现在我像这样切片向量:

for (size_t i = 30; i < trades.rows(); ++i) {
    VectorT slice = trades(seq(i - 30, i));
}

但我不知道我可以对新切片

buyQuantity
中每个
Trade
的属性
vector
求和。

请问有什么想法吗?

c++ eigen
1个回答
0
投票

虽然 Eigen 支持自定义类型的向量,但这不是其主要目的。您不会获得 Eigen 的许多优势。您也可以使用

std::accumulate

double sum = std::accumulate(vec.begin(), vec.end(), 0.,
        [](double left, const Trade& right) {
            return left + right.buyQuantity;
        });

您还可以通过

unaryExpr
提取属性,以便您可以使用 Eigen 的正常数字例程。但这也阻止了 Eigen 使用其内置矢量化。编译器仍然可能,但不是总和,除非您使用
-ffast-math
或类似的、通常不安全的优化进行编译。

double sum = vec.unaryExpr([](const Trade& t) { return t.buyQuantity; }).sum();

总的来说,我建议不要使用结构数组。您应该使用数组结构(这意味着每个属性都应该是自己的

VectorXd
。关于该主题有大量讨论,例如我对 AoS 与 SoA 优点/缺点的理解是否正确?

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