Выбор соответствующих строк может быть сделан в одной строке путем сохранения результата сравнения всех элементов в последнем столбце в логический массив, который может быть преобразован в VectorXi.
VectorXi is_selected = (mat.col(last_col).array() > 0.3).cast<int>();
Эта информация может затем использоваться для подготовки новой матрицы, которая содержит только выбранные строки. Весь код, использующий этот метод, показан ниже.
#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;
}
Демонстрация: https://godbolt.org/z/f0_fC0
Редактировать: Использование новой функции (ветка разработки Eigen 3.4 или 3.3.90)
Ветвь разработкиof Eigen обеспечивает новую перегрузку конструктора MatrixX, которая допускает прямое подмножество данной матрицы.
MatrixXd mat_sel = mat(keep_rows, keep_cols);
Столбцы и строки, которые следует сохранить, хранятся в Eigen::VectorXi
или в std::vector<int>
:
#include <Eigen/Dense>
#include <iostream>
#include <vector>
using namespace Eigen;
int main() {
MatrixXd mat = MatrixXd::Random(10,5);
std::cout << "original:\n" << mat << std::endl;
std::vector<int> keep_rows;
for (int i = 0; i < mat.rows(); ++i) {
if (mat(i,mat.cols() - 1) > 0.3) {
keep_rows.push_back(i);
}
}
VectorXi keep_cols = VectorXi::LinSpaced(mat.cols(), 0, mat.cols());
MatrixXd mat_sel = mat(keep_rows, keep_cols);
std::cout << "selected:\n" << mat_sel << std::endl;
}
Демо: https://godbolt.org/z/Ag7g7f