c++ - 获取密集 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(最有效)来做到这一点?
解决方案
在网络上进行了大量研究并受到这篇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;
}
推荐阅读
- excel - 在多个 Excel 实例之间共享变量
- qt - QTimer 可以在队列不为空时触发吗?
- groovy - 需要使用 replaceAll 方法从值中删除不需要的符号
- firebase - 如果文档路径有逗号,则 Firestore 规则会中断
- node.js - 从嵌套块返回最终的 observable
- python - 使用scrapy循环遍历发现的a-href url链接来抓取相应的页面
- java - 我如何使用 Maven 来指定要运行哪个 Junit @Category 测试,而无需指定每个类别的完整路径?
- c# - Blazor: InvalidOperationException while attempting to activate custom service
- c++ - 截屏,分析,然后删除
- python - 迭代到达 rowsums = colsums for i = j 的循环