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

时间:2015-06-02 20:21:18

标签: c++ opencv sparse-matrix

有没有办法获取2D SparseMat特定行的所有非零的索引,而不会遍历该行?

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

lboxsupplier.DataSource = dsPennyburnGreg.Tables["Supplier"]

提前感谢您的任何建议!

1 个答案:

答案 0 :(得分:0)

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

// 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(": %g\n", it.value<float>());
    s += *it;
}
printf("Element sum is %g\n", 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,我不知道相关的订单。