c++ - Eigen 获取索引数组,其中 vector 中的值为 true(不需要 for 循环)

标签 c++ indexing eigen

我有 vector

Eigen::VectorXf test(4);
test << 1.231, 1.23, 0.41, 1.233;

我正在尝试获取 test.array() > 1 的索引。我希望结果是数组形式(std::vector 就可以了)并且我想利用特征优化(即没有不必要的 for 循环)。结果应为 {0, 1, 3}。我该如何去做呢?

编辑

我收到了一个类似的问题 Eigen Indices of Dense Matrix meeting Condition

但关键的区别是我使用的是 vector ,因此一切都基于一维

编辑2

作为引用,我将如何在 xtensor 中执行相同的操作

自动索引 = xt::flatten_indices(xt::argwhere(xt::greater(xt::flatten(data), 1)));

最佳答案

基于这个答案Eigen Indices of Dense Matrix meeting Condition ,我使用访客得到了结果。这次我检查值是否为 NaN 而不是大于 1。

template<typename Func>
struct lambda_as_visitor_wrapper : Func {
    lambda_as_visitor_wrapper(const Func& f) : Func(f) {}
    template<typename S, typename I>
    void init(const S& v, I i, I j) { return Func::operator()(v, i, j); }
};

template<typename Mat, typename Func>
void visit_lambda(const Mat& m, const Func& f)
{
    lambda_as_visitor_wrapper<Func> visitor(f);
    m.visit(visitor);
}


...
    std::vector<int> indices;
    int th = 1;

    visit_lambda(open.data,
        [&indices, th](double v, int i, int j) {
            if (std::isnan(v))
                indices.push_back(i);
        });

虽然我不会详细介绍所使用的数据,但 xtensor 相当于此

xt::flatten_indices(xt::argwhere(xt::isnan(open2.data)))

速度要慢得多,Eigen 的计时速度大约快 8 倍(366 个 float )。

关于c++ - Eigen 获取索引数组,其中 vector 中的值为 true(不需要 for 循环),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61872816/

相关文章:

c++ - 内联关键字与标题定义

mysql - 为什么 MySQL 使用错误的索引?

c++ - 如何在 Eigen 中将行 vector 转换为列 vector ?

c++ - 如果结构已更改,则将结构读取和写入二进制文件

c++ - C语言中有 'minimizing stack overflow of an array'之类的东西吗?

尝试使用 list.insert 时出现 Python 索引错误

java - 如何获取我不知道的数组的索引?

c++ - 超定线性代数方程的最小二乘解Ax = By

c++ - 对 Eigen QR 分解感到困惑

c++ - 将 header 包含到 .h 文件中