c++ - 在 eigen 中使用 std::nth_element 和相关的询问

标签 c++ eigen

我正在自学 c++ 和 eigen, 所以也许这是一个简单的问题。

给定 n 和 0 "<"m "<"n,以及一个 n vector d 的 float 。具体来说:

VectorXf d = VectorXf::Random(n)

我想要一个包含整数的 m vector d_prim onf d 中小于或等于的所有条目的索引 d 的第 m 个最大条目。效率很重要。如果有平局 在数据中,然后填充 d_prim d 的前 m 个条目 小于它的第 m 个最大条目是可以的(我真的需要 不大于第 m^th 大条目的 m 个数字的索引 d).

我试过(天真地):

float hst(VectorXf& d,int& m){
//  VectorXf d = VectorXf::Random(n);
    std::nth_element(d.data().begin(),d.data().begin()+m,d.data().end());
    return d(m);
}

但是它有两个问题:

  1. 没用
  2. 即使它确实有效,我仍然必须通过一次 d 的(拷贝)来找到索引 那些小于 d(m) 的条目。有这个必要吗?

最好的,

最佳答案

std::nth_element是你想要的(与我之前所说的相反)。它执行部分操作,以便 [first, mth) 范围内的元素小于 [mth, last) 范围内的元素。因此,在运行 nth_element 之后,您只需将第一个 m 元素复制到新 vector 。

VextorXf d = VectorXf::Random(n);
VectorXi d_prim(m);

std::nth_element(d.data().begin(), d.data.begin() + m, d.data().end());
std::copy(d.data().begin(), d.data().begin() + m, d_prim.begin());

This answer有更多关于执行此操作的算法的信息。

关于c++ - 在 eigen 中使用 std::nth_element 和相关的询问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9507923/

相关文章:

c# - 为什么我的 C++ Windows 窗体中有 C# 代码,而 C++ 函数弹出错误?

c++ -++i 或 i++ 在 for 循环中??

math - 使用 Eigen 计算 2D 相机的模型 View 矩阵

c++ - 逗号初始化和构造函数 C++ 和 Eigen

c++ - 如何配置 Qt 以使用 Visual Studio 2010?

c++ - atoi() 一直返回 0

c++ - C++ 中的段错误(Eigen 库)

c++ - Eigen :如果我只能计算 Aty 和 Ax,是否有可能创建类似 LeastSquareDiagonalPreconditioner 的调节器?

c++ - 通过观察者将信号映射到插槽以获得可变数量的参数

c++ - 如何声明 Eigen 矩阵,然后通过嵌套循环对其进行初始化