本征获取向量为真的索引数组(对于循环没有必要)

问题描述 投票:0回答:1

我有载体

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

我正在尝试获取test.array() > 1的索引。我希望结果以数组形式出现(std :: vector很好),我想利用特征优化(即循环的[[no不必要)优势。结果应为{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)));

c++ indexing eigen
1个回答
0
投票
基于此答案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个浮点数)。

© www.soinside.com 2019 - 2024. All rights reserved.