OpenCV稀疏矩阵:如何在一行/列中获得非零元素的索引



是否有一种方法可以获得2D SparseMat的特定行的所有非零的索引,而无需在行上循环?

下面的代码使用循环打印第y行的结果。

for(int x = 0; x < sparse_mat.size(1); x++)
{
     if(sparse_mat.ref<int>(y,x) != 0)
            std::cout<<x<<std::endl;  
}

提前感谢您的任何建议!

我没有OpenCV,但是通过阅读文档我发现了这个例子:

// prints elements of a sparse floating-point matrix
// and the sum of elements.
SparseMatConstIterator_<float>
    it = sparse_mat.begin<float>(),
    it_end = sparse_mat.end<float>();
double s = 0;
int dims = sparse_mat.dims();
for(; it != it_end; ++it)
{
    // print element indices and the element value
    const SparseMat::Node* n = it.node();
    printf("(");
    for(int i = 0; i < dims; i++)
        printf("%d%s", n->idx[i], i < dims-1 ? ", " : ")");
    printf(": %gn", it.value<float>());
    s += *it;
}
printf("Element sum is %gn", s);

以及以下内容:

如果你运行这个循环,你会注意到元素不是枚举的按照逻辑顺序(字典顺序等等)。它们进来是一样的顺序,因为它们存储在哈希表中(半随机)。你可能收集指向节点的指针并对它们进行排序以获得适当的排序。但是请注意,指向节点的指针可能会失效当你向矩阵中加入更多的元素时。这可能是由于可能的缓冲区重新分配。

这意味着(有点明确地)数据存储在哈希表中,而不是作为索引和值的向量,或者像Eigen那样。它应该使您能够筛选节点而不是特定行;就像

for(; it != it_end; ++it)
{
    const SparseMat::Node* n = it.node();
    if(n->idx[ROW_INDEX])
        std::cout << n->idx[COL_INDEX] << std::endl;
}

相应替换ROW_INDEXCOL_INDEX,我不知道相关顺序

相关内容

  • 没有找到相关文章

最新更新