2015-06-02 3 views
1

Есть ли способ получить индексы всех не нулей определенной строки 2D SparseMat, не зацикливаясь на строке?Разреженная матрица OpenCV: как получить индексы ненулевых элементов в строке/столбце

Следующий код, используя цикл, распечатывает результаты для y-й строки.

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

Благодарим вас за любые предложения!

ответ

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_INDEX и COL_INDEX соответственно, я не знаю, соответствующий заказ.

+1

Hi. Спасибо за ответ. Но я думаю, что если общее число узлов больше числа столбцов, ваше решение еще хуже: ваше решение выполняет итерацию по всем узлам, в то время как решение, которое я предложил в вопросе, повторяется в течение одной строки. – Khue

+0

Да, но внимательно прочитайте [документацию] (http://docs.opencv.org/master/dd/da9/classcv_1_1SparseMat.html#a0e1e95540e8cc75976bb4be97dc2203e). 'ref' создает узел, если вы указываете несуществующий индекс. Вы хотели бы использовать 'ptr', который дает вам [control] (http://docs.opencv.org/master/dd/da9/classcv_1_1SparseMat.html#a810b96cf23e3cc816e7f99473b81b513) о том, хотите ли вы создать отсутствующий узел или нет. –

+0

Хорошая точка. Но это на самом деле не отвечает на мой вопрос :(Может быть, такого решения не существует :( – Khue

Смежные вопросы