我已经声明了我创建的类的向量,如下所示:
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
求和。
请问有什么想法吗?
虽然 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 优点/缺点的理解是否正确?