微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对特征矩阵执行布尔系数运算并返回找到的元素的索引

如何解决对特征矩阵执行布尔系数运算并返回找到的元素的索引

我试图找到一种最快的方法来对特征矩阵执行 ><=|& 运算并返回找到的元素的索引。 现在我可以像我的例子一样分两步完成:

#include <Eigen/Dense>

#include <iostream>
#include <chrono>

template <typename T>
Eigen::VectorX<Eigen::Index> findNonZeroInd(const Eigen::DenseBase<T> &M){
  Eigen::VectorX<Eigen::Index> ind(M.size());
  Eigen::Index ii = 0;
  for (Eigen::Index i = 0; i < M.size(); i++){
    if (M(i) != 0){
      ind(ii) = i;
      ii++;
    }
  }
  ind.conservativeResize(ii);

  return ind;
}

int main()
{
  size_t N = 3000;
  Eigen::MatrixXd m = Eigen::MatrixXd::Random(N,N);

  Eigen::MatrixX<bool> ar = m.array() > 0;
  
  std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::Now();
  Eigen::VectorX<Eigen::Index> ind = findNonZeroInd(ar);
  std::chrono::steady_clock::time_point end = std::chrono::steady_clock::Now();
  std::cout << "Eigen-find Time difference = " << std::chrono::duration_cast<std::chrono::milliseconds>(end - begin).count() << "[µs]" << std::endl;

  return 0;
}

在我的示例中,操作 Eigen::MatrixX<bool> ar = m.array() > 0; 大约需要 11-14 毫秒,而 Eigen::VectorX<Eigen::Index> ind = findNonZeroInd(ar); 大约需要 80 毫秒

我觉得它可以改进,但我在 C++ 和 Eigen 方面的经验不够。

那么有没有办法提高性能

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。