是否有一种方法可以获得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_INDEX
和COL_INDEX
,我不知道相关顺序