Eigen 获取索引数组,其中向量中的值为真(没有不必要的循环)
Eigen get array of indexes where values in vector are true (no unnecessary for loops)
我有向量
Eigen::VectorXf test(4);
test << 1.231, 1.23, 0.41, 1.233;
我正在尝试获取 test.array() > 1
位置的索引。我希望结果是数组形式(std::vector 很好)并且我想利用特征优化(即 没有不必要的 循环)。结果应为 {0, 1, 3}。我该怎么做?
编辑
我收到了一个类似的问题
但关键区别在于我使用的是向量,因此一切都基于一维
编辑 2
此处供参考,我将如何在 xtensor 中做同样的事情
auto indexes = xt::flatten_indices(xt::argwhere(xt::greater(xt::flatten(data), 1)));
根据这个答案 ,我使用访问者得到了结果。这次我检查值是否为 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 个浮点数)。
我有向量
Eigen::VectorXf test(4);
test << 1.231, 1.23, 0.41, 1.233;
我正在尝试获取 test.array() > 1
位置的索引。我希望结果是数组形式(std::vector 很好)并且我想利用特征优化(即 没有不必要的 循环)。结果应为 {0, 1, 3}。我该怎么做?
编辑
我收到了一个类似的问题
但关键区别在于我使用的是向量,因此一切都基于一维
编辑 2
此处供参考,我将如何在 xtensor 中做同样的事情
auto indexes = xt::flatten_indices(xt::argwhere(xt::greater(xt::flatten(data), 1)));
根据这个答案 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 个浮点数)。