稀疏矩阵:确定值是否为空的最快方法?

时间:2017-02-05 14:55:54

标签: c++ eigen

使用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 pagesquick refrelevant manual pages,但没有找到任何内容。

如果这似乎不可能,那么我正在考虑将它包含在一个类中,同时包含一个包含所有填充位置的地图。这样我就可以快速找出给定的行col是否有值。

附录:我有Eigen 3.2但如果需要可以切换到3.3。

编辑:链接的问题会询问如何获取一组非null元素。我要求的是“如何知道(row,col)的值是否为空?”。不是骗局AFAIK。

2 个答案:

答案 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()相同的方式进行二进制搜索。实际上,您可以复制该功能,将所有退货替换为truefalse,并使用plugin-mechanism将其整合到SparseMatrix

但大多数情况下,访问稀疏矩阵的各个元素效率很低。