如何利用布尔数组提取Eigen::VectorXd子数组并计算均值?
在Eigen中实现布尔索引提取元素并计算均值
Eigen没有像NumPy那样直接支持布尔数组索引的语法,但可以通过以下几种方式实现你需要的功能:
方法1:手动遍历收集元素
这是最直接的实现方式,遍历布尔掩码,收集符合条件的元素并计算均值:
// 预分配空间,提升效率 Eigen::VectorXd fixed_values; fixed_values.reserve(fixed_indices.count()); for (int i = 0; i < fixed_indices.size(); ++i) { if (fixed_indices(i)) { fixed_values.push_back(0.5 * (xl(i) + xu(i))); } }
方法2:构建索引列表后批量提取
先收集所有fixed_indices为true的位置索引,再用Eigen的整数索引提取功能批量获取元素并计算,这种方式更符合Eigen的向量操作风格,效率更高:
// 收集符合条件的索引 std::vector<int> indices; indices.reserve(fixed_indices.count()); for (int i = 0; i < fixed_indices.size(); ++i) { if (fixed_indices(i)) { indices.push_back(i); } } // 将std::vector转换为Eigen整数向量 Eigen::VectorXi eigen_indices = Eigen::Map<Eigen::VectorXi, Eigen::Unaligned>(indices.data(), indices.size()); // 批量提取并计算均值 Eigen::VectorXd fixed_values = 0.5 * (xl(eigen_indices) + xu(eigen_indices));
补充说明
fixed_indices.count()可以快速获取布尔向量中true的数量,用来预分配容器空间,避免频繁内存分配。- Eigen的
Vector<bool>是特殊的位压缩容器,访问效率略低于普通向量,但count()方法是优化过的,性能表现良好。
内容的提问来源于stack exchange,提问作者Tom M. Ragonneau
相关产品推荐
相关产品推荐

