Я не 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
соответственно, я не знаю, соответствующий заказ.
Hi. Спасибо за ответ. Но я думаю, что если общее число узлов больше числа столбцов, ваше решение еще хуже: ваше решение выполняет итерацию по всем узлам, в то время как решение, которое я предложил в вопросе, повторяется в течение одной строки. – Khue
Да, но внимательно прочитайте [документацию] (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) о том, хотите ли вы создать отсутствующий узел или нет. –
Хорошая точка. Но это на самом деле не отвечает на мой вопрос :(Может быть, такого решения не существует :( – Khue