使用Eigen:给定一个大的稀疏矩阵,确定给定位置的值是否为空的最快方法是什么?
必须说我使用这种稀疏矩阵实现来存储非数字值。它与this question有关。
目前,我所拥有的是(T
我的数据类型):
Eigen::SparseMatrix<T> mat(n,n); // n could be 1000, 10000, ...
// fill
T e1( /* some values */ );
mat.insert( 3, 4 ) = e1;
...
检查完成:
T elem = mat.coeff( row, col );
if( elem == T() ) // use default constructor
std::cout << "empty !\n";
但这并不能让我满意,因为它意味着复制操作和深度比较运算符。我想要的可能是:
if( mat.isNull( row, col ) )
std::cout << "empty !\n";
有没有办法可以做到这一点?或者如果为空则获取返回nullptr
的指针?
我检查了Tutorial pages,quick ref和relevant manual pages,但没有找到任何内容。
如果这似乎不可能,那么我正在考虑将它包含在一个类中,同时包含一个包含所有填充位置的地图。这样我就可以快速找出给定的行col是否有值。
附录:我有Eigen 3.2但如果需要可以切换到3.3。
编辑:链接的问题会询问如何获取一组非null元素。我要求的是“如何知道(row,col)的值是否为空?”。不是骗局AFAIK。
答案 0 :(得分:1)
派生自https://eigen.tuxfamily.org/dox-devel/group__TutorialSparse.html,您可以定义空检查功能,如
bool isNull(const Eigen::SparseMatrix<T>& mat, int row, int col)
{
for (Eigen::SparseMatrix<T>::InnerIterator it(mat, col); it; ++it) {
if (it.row() == row) return false;
}
return true;
}
这样你就不会复制任何东西了。你也没有进行深度比较。
答案 1 :(得分:1)
根据每列的元素数量,最有效的解决方案可能是以与coeffRef()
相同的方式进行二进制搜索。实际上,您可以复制该功能,将所有退货替换为true
或false
,并使用plugin-mechanism将其整合到SparseMatrix
。
但大多数情况下,访问稀疏矩阵的各个元素效率很低。