首页 > 解决方案 > 获取密集 Eigen::Matrix 对象的所有非零值

问题描述

假设您有一个动态大小的 Eigen::Matrix 对象并且只想对非零值进行一些计算,那么如何获得所有非零值的向量或列表表示?

Matrix3f m;
m << 1, 0, 0,
     0, 5, 6,
     0, 0, 9;
VectorXf v = get_non_zero_values(m);
cout << v;

应该给你

1 5 6 9

如何使用 Eigen(最有效)来做到这一点?

标签: c++eigendata-manipulationeigen3

解决方案


在网络上进行了大量研究并受到这篇stackoverflow 帖子的启发后,我想出了自己的解决方案

template <typename T>
Eigen::Matrix<T, Eigen::Dynamic, 1> get_non_zeros(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& _input)
{
    Eigen::Matrix<T, Eigen::Dynamic, 1> reduced(Eigen::Map<Eigen::Matrix<T, Eigen::Dynamic, 1>>(_input.data(), _input.size()));
    Eigen::Matrix<bool, Eigen::Dynamic, 1> empty = (reduced.array() == 0).rowwise().all();

    size_t last = reduced.rows() - 1;
    for ( size_t i = 0; i < last + 1;) {
        if ( empty(i) ) {
            reduced.row(i).swap(reduced.row(last));
            empty.segment<1>(i).swap(empty.segment<1>(last));
            --last;
        }
        else {
            ++i;
        }
    }

    reduced.conservativeResize(last + 1, reduced.cols());

    return reduced;
}

推荐阅读