【问题标题】:Eigen get array of indexes where values in vector are true (no unnecessary for loops)Eigen 获取向量中的值为真的索引数组(不需要循环)
【发布时间】:2020-05-18 15:13:55
【问题描述】:

我有矢量

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

我正在尝试获取test.array() &gt; 1 的索引。我希望结果是数组形式(std::vector 很好),并且我想利用特征优化(即 没有不必要的 for 循环)。结果应为 {0, 1, 3}。我该怎么做呢?

编辑

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

但主要区别在于我使用的是向量,因此一切都基于一维

编辑 2

这里的参考是我将如何在 xtensor 中做同样的事情

auto indexes = xt::flatten_indices(xt::argwhere(xt::greater(xt::flatten(data), 1)));

【问题讨论】:

  • 这能回答你的问题吗? Eigen Indices of Dense Matrix meeting Condition
  • @AskoldIlvento 在我的例子中,它是一个向量。
  • cplusplus.com/reference/functional/greater - 然后只打印 1 或 0 而不是排序?
  • @MichaelDorgan 我正在尝试获取索引,而不是值
  • 然后在 foreach 循环中运行它并将索引的真/假存储在另一个数组中?或者你需要更紧凑的东西?从您的输出来看,您似乎只想要一个真/假数组。如果您想要一个索引数组,请更新问题。

标签: c++ indexing eigen


【解决方案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 个浮点数)。

【讨论】:

    猜你喜欢
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    相关资源
    最近更新 更多