Eigen3根据列条件选择行出

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

我在本征中有一个二维的矩阵,例如:

122 443 544 456 0.9
324 435 5465 645 0.8
32 434 545 546 0.778
435 546 6565 656 0.6878
546 6565 656 3453 54 0.7788
5456 546 545 6565 3434 0.244
435 5456 656 656 6565 0.445
.....

当最后一列的值大于0.3时,我想选择所有行(或获取其行索引)。

我知道我可以通过迭代所有行并判断最后一个元素来执行此操作,但是我可能有10000行,要执行此操作,迭代将非常慢。

还有更好的方法吗?

c++ eigen eigen3
2个回答
1
投票

您可以尝试使用列而不是行,并将最后一列与矢量[n x 1]的0.3比较


0
投票

相关行的选择可以通过将最后一列中元素的比较结果存储到一个布尔数组中而可以在一行中完成,该布尔数组可以转换为VectorXi。然后,通过单个循环构造具有选定行的新矩阵。

#include <Eigen/Dense>
#include <iostream>    
using namespace Eigen;

int main() {
  const int nr = 10;
  const int nc = 5;
  MatrixXd mat = MatrixXd::Random(nr,nc);
  std::cout << "original:\n" << mat << std::endl;
  int last_col = mat.cols() - 1;

  VectorXi is_selected = (mat.col(last_col).array() > 0.3).cast<int>() ;

  MatrixXd mat_sel(is_selected.sum(), mat.cols());
  int rownew = 0;
  for (int i = 0; i < mat.rows(); ++i) {
     if (is_selected[i]) {       
       mat_sel.row(rownew) = mat.row(i);
       rownew++;
     }
  }
  std::cout << "selected:\n" << mat_sel << std::endl;
}

输出:

original:
  0.680375 -0.0452059  -0.967399  0.0258648    0.05349
 -0.211234   0.257742  -0.514226   0.678224   0.539828
  0.566198  -0.270431  -0.725537    0.22528  -0.199543
   0.59688  0.0268018   0.608354  -0.407937   0.783059
  0.823295   0.904459  -0.686642   0.275105  -0.433371
 -0.604897    0.83239  -0.198111  0.0485744  -0.295083
 -0.329554   0.271423  -0.740419  -0.012834   0.615449
  0.536459   0.434594  -0.782382    0.94555   0.838053
 -0.444451  -0.716795   0.997849  -0.414966  -0.860489
   0.10794   0.213938  -0.563486   0.542715   0.898654
selected:
-0.211234  0.257742 -0.514226  0.678224  0.539828
  0.59688 0.0268018  0.608354 -0.407937  0.783059
-0.329554  0.271423 -0.740419 -0.012834  0.615449
 0.536459  0.434594 -0.782382   0.94555  0.838053
  0.10794  0.213938 -0.563486  0.542715  0.898654
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.